我想在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;
}
答案 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();
结果:
答案 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.
输入图片
输出图片
2重叠矩阵
答案 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);