2017-02-13 46 views
-2

我想在我轉換爲灰色的視頻捕捉中繪製一個矩形。使用opencv將視頻捕獲設爲灰度並在其中繪製矩形?

這是我的代碼:

#include <opencv2/core.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
using namespace cv; 
using namespace std; 

int main(int argc, char* argv[]) 
{ 
    VideoCapture cap(0); 
    if (!cap.isOpened()) 
    { 
     // print error msg 
     return -1; 
    } 

    namedWindow("gray", CV_WINDOW_AUTOSIZE); 
    int pointf[8][4] = { 
          {100,100 , 150,50}, 
          {100,250 , 150,200}, 
          {100,430 , 150,380}, 
          {295,200 , 345,150}, 
          {295,400 , 345,350}, 
          {490,100 , 540,50}, 
          {490,250 , 540,200}, 
          {490,430 , 540,380} 
          }; 
    int i; 
    int j; 
    Mat frame; 
    Mat gray; 
    for (;;) 
    { 
     cap >> frame; 

     cvtColor(frame, gray, CV_BGR2GRAY); 
     for (i = 0; i < 8; i++) { 
      rectangle(frame, Point(pointf[i][0],pointf[i][1]), Point(pointf[i][2], pointf[i][3]), Scalar(0, 0, 255), 3); 
     } 
     imshow("gray", gray); 
     imshow("gray",frame); 
     if (waitKey(30) >= 0) 
      break; 

    } 

    return 0; 

} 

在結果中,我成功繪製矩形八,但視頻並不是一個灰度。如果我對imshow進行重新排序(先製作視頻灰色,然後繪製矩形),則會以灰度製作視頻,但矩形未顯示。

那麼,我想要做什麼建議? 我是新的使用開放式的CV。 我在Visual Studio 2015中使用open cv 3.1.0和C++ 謝謝。

回答

0

仔細查看您的代碼。下面是你在做什麼:

imshow("gray", gray); 
    imshow("gray",frame); 

這裏做的事情是,首先,它顯示在一個名爲灰色窗口的灰度圖像,然後立即顯示您的彩色圖像frame在同一個窗口。這意味着你根本看不到你的灰色影像。那是你的第一個錯誤

第二個錯誤是語句:

rectangle(frame, Point(pointf[i][0],pointf[i][1]), Point(pointf[i][2], pointf[i][3]), Scalar(0, 0, 255), 3); 

frame是你的RGB圖像,不是你的灰度圖像,這樣你就不是你的灰度圖像上繪製一個矩形的。

如果你需要轉換你的原始圖像灰度圖像,然後畫上一個矩形,這裏就是你做:

for (;;) 
    { 
     cap >> frame; 

     cvtColor(frame, gray, CV_BGR2GRAY); 
     for (i = 0; i < 8; i++) { 
      //draw rect on gray, not frame 
      rectangle(gray, Point(pointf[i][0],pointf[i][1]), Point(pointf[i][2], pointf[i][3]), Scalar(0, 0, 255), 3); 
     } 
     //display the Mat objects in different windows 
     imshow("gray", gray); 
     imshow("original",frame); 
     if (waitKey(30) >= 0) 
      break; 

    }