小编Mar*_*rro的帖子

OpenCV GPU Farneback Optical Flow在多线程中非常有效

我的应用程序使用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)

c++ multithreading opencv gpu opticalflow

6
推荐指数
1
解决办法
1770
查看次数

在 OpenCV 中绘制梯度矢量场

我想计算的灰度图像的(梯度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)

c++ opencv gradient field vector

5
推荐指数
1
解决办法
5128
查看次数

如何知道为Ubuntu 12.04构建的OpenCV 2.3.1设置了哪些标志?

我需要在已经构建OpenCV的计算机上工作,而不是我的计算机.但是,我想知道在构建时已经设置了哪些标志,例如WITH_TBB =,WITH_CUDA =,依此类推.有没有办法从某个文件中获取此信息?

c++ opencv

0
推荐指数
1
解决办法
635
查看次数

Linux中高效的ogv视频转换

我有一个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)

video ffmpeg

-1
推荐指数
1
解决办法
2816
查看次数

标签 统计

c++ ×3

opencv ×3

ffmpeg ×1

field ×1

gpu ×1

gradient ×1

multithreading ×1

opticalflow ×1

vector ×1

video ×1