我的应用程序使用Opencv gpu类gpu::FarnebackOpticalFlow来计算输入视频的一对连续帧之间的光流.为了加快这个过程,我利用OpenCV的TBB支持在多线程中运行该方法.但是,多线程性能的行为与单线程性能不同.只是为了让您了解不同的行为,这里有两个快照,分别是单线程和多线程实现.
多线程实现假设将图像分成8个不同的条带(我的pc上的核心数),并且每个应用光流的Farneback实现的gpu方法.以下是两种方法的相应代码行:
单线程实现
/* main.cpp */
//prevImg and img are the input Mat images extracted from the input video
...
GpuMat gpuImg8U(img);
GpuMat gpuPrevImg8U(prevImg);
GpuMat u_flow, v_flow;
gpu::FarnebackOpticalFlow farneback_flow;
farneback_flow.numLevels = maxLayer;
farneback_flow.pyrScale = 0.5;
farneback_flow.winSize = windows_size;
farneback_flow.numIters = of_iterations;
farneback_flow(gpuPrevImg8U,gpuImg8U,u_flow,v_flow);
getFlowField(Mat(u_flow),Mat(v_flow),optical_flow);
...
}
void getFlowField(const Mat& u, const Mat& v, Mat& flowField){
for (int i = 0; i < flowField.rows; ++i){
const float* ptr_u = u.ptr<float>(i);
const float* ptr_v = v.ptr<float>(i);
Point2f* row = flowField.ptr<Point2f>(i); …Run Code Online (Sandbox Code Playgroud) 我想计算的灰度图像的(梯度smoothed_plane中的代码),并绘制它作为在OpenCV中的矢量场,叠加现有的图像。
我尝试应用一对 Sobel 算子(我也尝试过 Scharr)来计算沿 x 和 y 的两个导数,如 OpenCV 文档中所述,但是当我尝试绘制时,矢量场似乎完全错误。我想了解我的错误是什么。
为了更清楚,我在这里放了一些代码。在此先感谢您的帮助。
//img is a gray-scale image
Mat abs_grad_x, abs_grad_y, grad;
Mat g_img;
int ddepth = CV_16S;
int scale = 1;
int delta = 0;
cvtColor(img,g_img,CV_GRAY2BGR);
smoothed_plane = Mat::zeros(image_height,image_width,CV_8UC1);
gradient_field = Mat::zeros(image_height,image_width,CV_32FC2);
// Smooth the dominant plane by convolution with a Gaussian
GaussianBlur(dominant_plane,smoothed_plane,Size(51,51),image_height*image_width*0.5);
/// Morphological opening (remove small objects from the foreground)
erode(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40+1,40+1)));
dilate(smoothed_plane, smoothed_plane, getStructuringElement(MORPH_ELLIPSE, Size(40, 40)));
/// Morphological closing (fill small holes in …Run Code Online (Sandbox Code Playgroud) 我需要在已经构建OpenCV的计算机上工作,而不是我的计算机.但是,我想知道在构建时已经设置了哪些标志,例如WITH_TBB =,WITH_CUDA =,依此类推.有没有办法从某个文件中获取此信息?
我有一个113MB的ogv视频文件.我将它转换为mp4并从命令行缩小了它的大小ffmpeg.由此产生的视频大小约为12MB,但质量非常糟糕.我想以更高的文件大小来获得更好的质量,但我不知道如何.你能建议我这样做的正确方法吗?
编辑:这是命令的完整控制台输出:
Input #0, ogg, from 'ibvs.ogv':
Duration: 00:00:58.86, start: 0.000000, bitrate: 16134 kb/s
Stream #0.0: Data: skeleton
Stream #0.1: Video: theora, yuv420p, 960x864 [PAR 1:1 DAR 10:9], 15 fps, 15 tbr, 15 tbn, 15 tbc
[buffer @ 0x1dbaa80] w:960 h:864 pixfmt:yuv420p
Output #0, mp4, to 'test.mp4':
Metadata:
encoder : Lavf53.21.1
Stream #0.0: Video: mpeg4, yuv420p, 960x864 [PAR 1:1 DAR 10:9], q=2-31, 200 kb/s, 15 tbn, 15 tbc
Stream mapping:
Stream #0.1 -> #0.0
Press ctrl-c to stop …Run Code Online (Sandbox Code Playgroud)