我想在视频捕捉中绘制一个矩形,然后转换为灰色。
这是我的代码:
#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(首先制作视频灰色,然后绘制矩形),它将以灰度制作视频,但矩形未显示。
那么,有什么建议我想做什么? 我是使用open cv的新手。 我在visual studio 2015中使用open cv 3.1.0和c ++ 感谢。
答案 0 :(得分: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;
}