【问题标题】:Blank frames when explicitly copying pixel values in OpenCV在 OpenCV 中显式复制像素值时出现空白帧
【发布时间】:2012-11-14 18:35:03
【问题描述】:

我一直在使用 OpenCV 2.4.3 将一些视频处理代码移植到 C++。以下测试程序密切模仿我的代码如何从视频中读取每一帧,对其内容进行操作,然后将新帧写入新视频文件。

奇怪的是,当单独设置像素时,输出帧完全是黑色的,但是当整个帧被克隆时,正确写入的。

在实践中,我会使用这两个宏来访问和分配所需的值,但示例中使用的顺序扫描更清楚地说明了这个想法。

有人知道我哪里出错了吗?

test.cpp:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace cv;

#define RGB_REF(PR,NC,R,C,CH) (*((PR) + ((3*(NC)*(R)+(C))+(CH))))
#define GRAY_REF(PR,NC,R,C) (*((PR) + (NC)*(R)+(C)))

int main(int argc, char* argv[])
{
    string video_path(argv[1]);
    cerr << "Video path is " + video_path + "\n";
    VideoCapture capture(video_path);
    if ( !capture.isOpened() )
    {
        cerr << "Input file could not be opened\n";
        return 1;
    } else
    {
        string output_path(argv[2]);
        VideoWriter output;
        int ex = (int)capture.get(CV_CAP_PROP_FOURCC);
        Size S = Size((int) capture.get(CV_CAP_PROP_FRAME_WIDTH),
                (int) capture.get(CV_CAP_PROP_FRAME_HEIGHT));
        output.open(output_path,ex,capture.get(CV_CAP_PROP_FPS),S,true);
        if ( !output.isOpened() )
        {
            cerr << "Output file could not be opened\n";
            return 1;
        }
        unsigned int numFrames = (unsigned int) capture.get(CV_CAP_PROP_FRAME_COUNT);
        unsigned int m = (unsigned int) capture.get(CV_CAP_PROP_FRAME_HEIGHT);
        unsigned int n = (unsigned int) capture.get(CV_CAP_PROP_FRAME_WIDTH);
        unsigned char* im = (unsigned char*) malloc(m*n*3*sizeof(unsigned char));
        unsigned char* bw = (unsigned char*) malloc(m*n*3*sizeof(unsigned char));
        Mat frame(m,n,CV_8UC3,im);
        Mat outputFrame(m,n,CV_8UC3,bw);
        for (size_t i=0; i<numFrames; i++)
        {
            capture >> frame;
            for (size_t x=0;x<(3*m*n);x++)
            {
                bw[x] = im[x];
            }
            output << outputFrame; // blank frames
//            output << frame;  // works
//            output << (outputFrame = frame); // works
        }
    }
}

【问题讨论】:

    标签: c++ video opencv video-processing


    【解决方案1】:

    当您从 VideoCapture 以 capture &gt;&gt; frame; 查询帧时,frame 会被修改。比如说,它有一个新的数据缓冲区。所以im不再指向frame的缓冲区。
    试试
    bm[x] = frame.ptr()[x];

    【讨论】:

    • 谢谢!文档没有说 anywhere,所以我(天真地)假设它会通过简单地覆盖同一块内存来优化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多