batuman
batuman

Reputation: 7304

Reading image from AVI using cvRetrieveFrame

I like to check the RGB sequence of the image read by cvRetrieveFrame. I checked as follow

    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");

I put r,g,b into cvMerge(r,0,0,0,c); alternately. But I see only yellow image. What is worng with my test code? I did cvSplit(frame_data.Ptr(), b, g, r, NULL); Then cvMerge(b,NULL,NULL,NULL,c);made yellow. cvMerge(NULL,g,NULL,NULL,c); made pink. And cvMerge(NULL,NULL,r,NULL,c); made green.

Thanks

Upvotes: 1

Views: 174

Answers (1)

Haris
Haris

Reputation: 14053

OpenCV store image BGR order and cvSplit should be like this

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

and for blue channel the merge should be

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

For green

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

For red

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

If you are getting colour other than RGB while merging the other two channel are not empty in your destination image, so just do cvZero(c) before merging.

You can also try below code with some image

    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();

Upvotes: 1

Related Questions