我想检查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);
变绿了。
由于
答案 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();