2014-03-07 122 views
0

我想繪製一張面部輪廓並將其覆蓋在網絡攝像頭圖像的頂部。在圖像頂部顯示輪廓

但是最後,我想我錯誤地使用了addWeighted,因爲我的程序崩潰了。

你能幫我理解我做錯了什麼嗎imshowaddWeighted

int main(int argc, const char** argv) 
{ 
    VideoCapture camera; 
    camera.open(0); 

    if(!camera.isOpened()) 
    { 
    cerr << "Could not access the camera!" << endl; 
    return 1; 
    } 

    while(true) 
    { 
    Mat cameraFrame; 
    camera >> cameraFrame; 

    if(cameraFrame.empty()) 
    { 
     cerr << "Could not grab a camera frame!" << endl; 
     return 1; 
    } 

    Mat gray; 
    cvtColor(cameraFrame, gray, CV_BGR2GRAY); 
    Size size = cameraFrame.size(); 
    Mat faceOutline = Mat::zeros(size, CV_8UC3);  // Draw a black canvas. 
    Scalar color = CV_RGB(255, 255, 0);    // Yellow 
    int thickness = 4; 
    ellipse(faceOutline, Point(320, 240), Size(320, 240), 0, 0, 360, color, thickness, CV_AA); 
    addWeighted(gray, 1.0, faceOutline, 0.7, 0, gray, CV_8UC3); 
    imshow("final image", gray); 

    char keypress = waitKey(20); 
    if(keypress == 27) break; 
    } 
} 

回答

1

的單通道這工作得很好:

int main(int argc, const char** argv) 
{ 
    VideoCapture camera; 
    camera.open(0); 

    if(!camera.isOpened()) 
    { 
     cerr << "Could not access the camera!" << endl; 
     return 1; 
    } 

    while(true) 
    { 
     Mat cameraFrame; 
     camera >> cameraFrame; 

     if(cameraFrame.empty()) 
     { 
      cerr << "Could not grab a camera frame!" << endl; 
      return 1; 
     } 

     Mat gray; 
     cvtColor(cameraFrame, gray, cv::COLOR_BGR2GRAY); 
     Size size = cameraFrame.size(); 
     Mat faceOutline = Mat::zeros(size, CV_8UC3);  // Draw a black canvas. 
     Scalar color = Scalar(255, 255, 0);    // Yellow 
     int thickness = 4; 
     cvtColor(gray, gray, cv::COLOR_GRAY2BGR); 
     ellipse(faceOutline, Point(320, 240), Size(320, 240), 0, 0, 360, color, thickness); 
     addWeighted(gray, 1.0, faceOutline, 0.7, 0, gray, CV_8UC3); 
     imshow("final image", gray); 
     char keypress = waitKey(20); 
     if(keypress == 27) break; 
    } 
} 
1
  • 爲什麼不畫橢圓進入cameraFrame? (相機幀,點(320,240),尺寸(320,240),0,0,360,顏色,厚度,CV_AA);以及其中,

  • ,如果你想使用addWeighted,

    1. 兩個輸入圖像的類型必須一致(不能將顏色添加到灰度圖像)
    2. 的因素要總結1.0
    3. 最後一個參數是深度,而不是類型(即你可以將其轉換爲浮動在這裏,但不改變信道的數量)

    addWeighted(cameraFrame,0.7%,faceOutline,0.3%,0, cameraFrame);

+0

我不知道這是可能相同的相機圖像上「畫」。感謝您的詳細和有益的評論。我嘗試了以前的代碼並使用同一個窗口,現在我可以正確地做到這一點。 – Joshua

1

我想你的灰色圖像是單通道,而你的faceOutline圖像有3個通道。

documentation

SRC2 - 相同的大小和信道號作爲SRC1的第二輸入數組。

嘗試mixChannels切換多通道圖像