2012-02-26 75 views
2

我想將2個ROI融合在一起。一個是灰度圖像的ROI,另一個是我使用cvNot反轉的二值圖像的ROI,以便將對象變成白色,將背景變成黑色。我想要的輸出與我現在用我的代碼得到的結果是相反的。在圖片中,二進制圖像放在灰度圖像上,但是我希望它是相反的方式,以便當前圖像中的白色將是灰度體,灰度背景則是黑色。 alpha blended output使用openCV進行alpha混合

這是我的代碼。請有人通過它並告訴我需要改變什麼來獲得我上面描述的輸出?我真的很感激。

#include "cv.h" 
#include "highgui.h" 

int main(int argc, char* argv) { 

CvCapture *capture = NULL; 
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi"); 
if(!capture){ 
    return -1; 
} 

IplImage* color_frame = NULL ; 
IplImage* new_frame = NULL ; 
    IplImage* res_frame = NULL; 
int thresh = 17;  

int frameCount=0;//Counts every 5 frames 
cvNamedWindow("contours", CV_WINDOW_AUTOSIZE); 

while(1) { 
    color_frame = cvQueryFrame(capture);//Grabs the frame from a file 
    if(!color_frame) break; 

    new_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1); 
    if(!color_frame) break;// If the frame does not exist, quit the loop 

    res_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1); 

    frameCount++; 
    if(frameCount==5) 
    { 
     cvCvtColor(color_frame, new_frame, CV_BGR2GRAY); 
     cvThreshold(new_frame, res_frame, thresh, 255, CV_THRESH_BINARY); 
     cvErode(res_frame, res_frame, NULL, 1); 
     cvDilate(res_frame, res_frame, NULL, 1); 
     cvNot (res_frame, res_frame); 

     int x = 75; 
     int y = 5; 
     int width = 125; 
     int height = 1500; 

     double alpha = 1; 
     double beta = 1; 

     cvSetImageROI(res_frame, cvRect(x, y, width, height)); 
     cvSetImageROI(new_frame, cvRect(x, y, width, height)); 

     //cvResetImageROI(new_frame); 
     cvAddWeighted(res_frame, alpha, new_frame, beta, 0.0, res_frame); 
     cvShowImage("contours", res_frame); 

     frameCount=0; 
    } 
    char c = cvWaitKey(33); 
    if(c == 27) break; 
} 

cvReleaseImage(&color_frame); 
cvReleaseImage(&new_frame); 
cvReleaseImage(&res_frame); 
cvReleaseCapture(&capture); 
cvDestroyWindow("contours"); 

return 0; 
} 

回答

2

根據您的閾值函數,我假設您要查看圖像的黑色/深灰色部分。 相反cvAddWeighted,你可以使用res_frame作爲掩模選擇新幀相關的部分是這樣的:

cvCopy(new_frame,new2_frame,res_frame); 

蒙面複製你僅在res_frame不爲零的像素創建新幀的new2_frame重複。如果你仍然需要roi,new2_frame的大小必須與new_frame相同或相同的roi大小。

+0

我也跟着你的建議,但我得到了一個錯誤說:在3020 project.exe在0x767db9bc未處理的異常:微軟C++異常:內存位置0x0039f98c品種::例外。另外,任何調用堆棧幀都不會加載符號。源代碼無法顯示。我的代碼太長,無法放入評論中,因此我將其作爲問題的答案發布。請看看它,看看這是你的意思。 – 2012-02-26 16:58:44

1

@ rics,這是你的意思嗎?

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 

using namespace std; 
int main(int argc, char* argv) { 

CvCapture *capture = NULL; 
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi"); 
if(!capture){ 
    return -1; 
} 

IplImage* color_frame = NULL ; 
IplImage* new_frame = NULL ; 
IplImage* res_frame = NULL; 
IplImage* new2_frame = NULL ; 
int thresh = 17;  

int frameCount=0;//Counts every 5 frames 
cvNamedWindow("contours", CV_WINDOW_AUTOSIZE); 

while(1) { 
    color_frame = cvQueryFrame(capture);//Grabs the frame from a file 
    if(!color_frame) break; 

    new_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1); 
    if(!color_frame) break;// If the frame does not exist, quit the loop 

    res_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1); 
    new2_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1); 


    frameCount++; 
    if(frameCount==5) 
    { 
     cvCvtColor(color_frame, new_frame, CV_BGR2GRAY); 
     cvThreshold(new_frame, res_frame, thresh, 255, CV_THRESH_BINARY); 
     cvErode(res_frame, res_frame, NULL, 1); 
     cvDilate(res_frame, res_frame, NULL, 1); 
     cvNot (res_frame, res_frame); 

     int x = 75; 
     int y = 5; 
     int width = 125; 
     int height = 1500; 

     //double alpha = 1; 
     //double beta = 1; 

     cvSetImageROI(res_frame, cvRect(x, y, width, height)); 
     cvSetImageROI(new_frame, cvRect(x, y, width, height)); 

     //cvResetImageROI(new_frame); 
     //cvAddWeighted(res_frame, alpha, new_frame, beta, 0.0, res_frame); 
     cvCopy(new_frame,new2_frame,res_frame); 
     cvShowImage("contours", new2_frame); 

     frameCount=0; 
    } 
    char c = cvWaitKey(33); 
    if(c == 27) break; 
} 

cvReleaseImage(&color_frame); 
cvReleaseImage(&new_frame); 
cvReleaseImage(&res_frame); 
cvReleaseImage(&new2_frame); 
    cvReleaseCapture(&capture); 
cvDestroyWindow("contours"); 

return 0; 
} 
+0

它幾乎沒問題,但你需要有相同大小的圖像進行復制,因此在2 cvSetImageROI行之後設置圖像roi以用於new2_frame:cvSetImageROI(new2_frame,cvRect(x,y,width,height)); – rics 2012-02-26 17:37:15

+0

@ rics非常感謝您的先生。這擺脫了錯誤。現在輸出是一個灰色背景上的黑體,但我會撥弄代碼並嘗試獲取我想要的輸出。再次感謝 – 2012-02-27 01:24:13