使用cvRetrieveFrame从AVI读取图像

时间:2013-11-26 02:12:22

标签: image opencv

我想检查cvRetrieveFrame读取的图像的RGB序列。我检查了如下

    frame_data = cvRetrieveFrame(readerAvi);
    cvShowImage("imageOrg", frame_data.Ptr());
    cvWaitKey();
    cvDestroyWindow("imageOrg");
    IplImage* r = cvCreateImage(cvGetSize(frame_data.Ptr()), IPL_DEPTH_8U, 1);    //r
    IplImage* g = cvCreateImage(cvGetSize(frame_data.Ptr()), IPL_DEPTH_8U, 1);    //g
    IplImage* b = cvCreateImage(cvGetSize(frame_data.Ptr()), IPL_DEPTH_8U, 1);    //b
    cvSplit(frame_data.Ptr(), r, g, b, NULL);
    IplImage* c = cvCreateImage(cvGetSize(frame_data.Ptr()), IPL_DEPTH_8U, 3);
    cvMerge(r,0,0,0,c);     
    cvShowImage("imageT", c);
    cvWaitKey();
    cvDestroyWindow("imageT");

我将r,g,b交替放入cvMerge(r,0,0,0,c);。但我只看到黄色图像。什么是我的测试代码? 我做了cvSplit(frame_data.Ptr(), b, g, r, NULL); 然后cvMerge(b,NULL,NULL,NULL,c);变黄了。       cvMerge(NULL,g,NULL,NULL,c);粉红色。并且cvMerge(NULL,NULL,r,NULL,c);变绿了。

由于

1 个答案:

答案 0 :(得分:1)

OpenCV商店图片BGR顺序和cvSplit应该是这样的

cvSplit(src, b, g, r, NULL);

对于蓝色通道,合并应为

cvMerge(b,NULL,NULL,NULL,c);

绿色

cvMerge(NULL,g,NULL,NULL,c);

红色

cvMerge(NULL,NULL,r,NULL,c);

如果您获得的颜色不是RGB,而其他两个频道在目标图片中不是空的,那么在合并前只需cvZero(c)

你也可以尝试使用一些图像下面的代码

    IplImage *src=cvLoadImage("img.jpg",1);

    IplImage* r = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);    //r
    IplImage* g = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);    //g
    IplImage* b = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);    //b
    cvSplit(src, b, g, r, NULL);
    IplImage* c = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);

    cvMerge(b,NULL,NULL,NULL,c);
    cvShowImage("Blue Channel", c);

    cvZero(c);
    cvMerge(NULL,g,NULL,NULL,c);
    cvShowImage("Green Channel", c);

    cvZero(c);
    cvMerge(NULL,g,NULL,NULL,c);
    cvShowImage("Green Channel", c);

    cvZero(c);
    cvMerge(NULL,NULL,r,NULL,c);
    cvShowImage("Red Channel", c);

    cvMerge(b,g,r,NULL,c);
    cvShowImage("Three Channel", c);
    cvWaitKey();