绘制矩形,如在热图上投票

时间:2014-10-21 08:29:20

标签: c++ image opencv

我想在opencv中创建mat文件并将它们初始化为零(所有像素都是黑色)。因此我用 用于初始化目的:

Mat img = Mat::zeros(image.rows, image.cols, CV_8UC1);

之后我在该图像中有一些带有位置的矩形,我想绘制矩形白色的相应区域。如何在mat文件中绘制区域?

我有以下功能来绘制rects。但是我想绘制所有矩形而不仅仅是边界。

static Mat image_draw(Mat image, vector<Rect> rect, CvScalar  color){

for(int i = 0; i < faces.size(); i++)
{
    Point pt1(rect[i].x + rect[i].width, rect[i].y + rect[i].height);
    Point pt2(rect[i].x, rect[i].y);
    rectangle(image, pt1, pt2, color, 5, 8, 0);
}
return image;

}

我想要做的确切事情是为我的矩形创建一个热图,使重叠的边界框具有更高的值(接近255),即简单的非重叠矩形。我改变了厚度:

img =  image_draw( img, rects,  cvScalar(255, 102, 255, 0), -1);

变量rects包含0到10个矩形。我想以某种方式聚合矩形绘图。不只是重新绘制矩形。

如果我想要它的功能,那就像这样:编辑最终解决方案:

static Mat heatmap2(Mat image1, vector<Rect> faces, CvScalar  color, int thickness) {

cv::Mat heatmap(image1.rows, image1.cols, CV_8U,cv::Scalar(0));

for(int i = 0; i < faces.size(); i++)
{
    cv::Mat temp(image1.rows, image1.cols , CV_8U, cv::Scalar(0));
    Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
    Point pt2(faces[i].x, faces[i].y);
    rectangle(temp, pt1, pt2, color, thickness, 8, 0);
    heatmap+=temp;
}

return heatmap;

}

3 个答案:

答案 0 :(得分:3)

试试这个:

    cv::Mat heatmap(200,300,CV_8U,cv::Scalar(0));
    {
        cv::Mat temp(200,300,CV_8U,cv::Scalar(0));
        cv::Rect r(10,20,30,30);
        cv::rectangle(temp,r,cv::Scalar(100),-1);
        heatmap+=temp;
    }
    {
        cv::Mat temp(200,300,CV_8U,cv::Scalar(0));
        cv::Rect r(20,25,30,30);
        cv::rectangle(temp,r,cv::Scalar(100),-1);
        heatmap+=temp;
    }
    cv::imshow("Heatmap",heatmap);
    cv::waitKey();

结果:

enter image description here

答案 1 :(得分:2)

来自组成矩形的官方OpenCV文档(检查here),&#34; 厚度。负值,如CV_FILLED,意味着函数必须绘制一个填充的矩形。&#34;

所以给厚度一个负值,如 -

rectangle(image, pt1, pt2, color, -1, 8, 0);

<强>更新 在代码中使用这些行

for(int i=0; i < rect.size(); i++)
            for( int y = rect[i].y; y < rect[i].y + rect[i].height; y++ )
                for( int x = rect[i].x; x < rect[i].x + rect[i].width; x++ )
                {
                    image.at<uchar>(y,x) =
                            saturate_cast<uchar>( image.at<uchar>(y,x) + 50 );
                }

此处每个Rect会将强度增加50,当它达到255时,它将保持255.

输入图片

enter image description here

输出图片

enter image description here

2重叠矩阵

enter image description here

答案 2 :(得分:1)

只需稍微修改一下代码即可:

static void draw_rectangles(Mat image, vector<Rect> faces) {

cv::Mat heatmap(image.rows, image.cols, CV_8U,cv::Scalar(0));

for(int i = 0; i < faces.size(); i++)
{
    cv::Mat temp = heatmat(faces[i]); // gives you a submatrix of your heatmap pointing at the location of your rectangle
    temp += 10; // add 10 grey levels to the existing values. This also modifies heatmap as side-effect
}
imshow("heatmap", heatmap);
waitKey(0);