Reputation: 7304
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
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