使用opencv将视频捕获设置为灰度并在其中绘制矩形?

时间:2017-02-13 23:34:33

标签: c++ opencv video

我想在视频捕捉中绘制一个矩形,然后转换为灰色。

这是我的代码:

#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 ++ 感谢。

1 个答案:

答案 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;

    }