2013-11-26 60 views
1

我喜歡檢查由cvRetrieveFrame讀取的圖像的RGB序列。我檢查如下使用cvRetrieveFrame從AVI讀取圖像

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);。但我只看到黃色的圖像。什麼是我的測試代碼worng? 我做過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

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