我正在尝试制作一张全黑的图像,除了图像中心的白色矩形之外。但是,在第一次尝试时,我得到了一个奇怪的结果,所以我更改了代码以查明问题所在。
因此,对于for循环,我尝试将中心的所有水平像素设置为白色,以在图像上绘制一条白线。下面是我的代码。
//--Block Mask--//
block_mask = cv::Mat::zeros(image_height, image_width, CV_8UC3);
int img_height = block_mask.rows;
int img_width = block_mask.cols;
for (int row = (img_height / 2); row < ((img_height / 2) + 1); row++)
{
for (int column = 0; column < img_width; column++)
{
block_mask.at<uchar>(row, column) = 255;
}
}
cv::namedWindow("Block Mask", CV_WINDOW_AUTOSIZE);
cv::imshow("Block Mask", block_mask);
img_height = 1080
img_width = 1920
image_height and image_width are defined from another image.
使用此代码,我希望看到在整个图像上绘制一条白线,但是,白线仅在图像的一部分上延伸。参见下图。
要进行故障排除,我创建了一个变量以计算内部for循环的迭代次数,并且按我的预期,它最多计数到1920
。这让我想知道是否与显示的图像有关?当简单地将单个像素(不是循环地)设置为到达行所在位置的白色时,也看不到结果。
我对这里发生的事情不知所措,因此,将不胜感激任何帮助或实现此目的的更好方法。
答案 0 :(得分:2)
已解决:图像<div class="modal fade" id="clear" tabindex="-1" role="dialog" aria-labelledby="Clear" aria-hidden="true">
<div class="modal-dialog modal-sm modal-notify modal-danger modal-dialog-centered" role="document">
<!--Content-->
<div class="modal-content text-center">
<!--Header-->
<div class="modal-header">
<p class="heading lead">Are you sure?</p>
</div>
<!--Footer-->
<div class="modal-footer justify-content-center">
<button class="btn btn-primary btn-xs" data-dismiss="modal">Yes</button>
<button class="btn btn-primary btn-xs" data-dismiss="modal">No</button>
</div>
</div>
<!--/.Content-->
</div>
是使用类型block_mask
创建的三通道BGR图像。但是,将像素值设置为白色时,将使用类型CV_8UC3
。此外,将其设置为值255的信号整数类型。
要正确设置每个像素的颜色,必须设置所有三个通道。这可以通过使用uchar
类型的变量来实现,该变量包含每个通道的值并且可以单独设置。可以通过以下方式完成:
cv::Vec3b
从此处开始,可以为该像素分配变量以更改其颜色,并确保将cv::Vec3b new_pixel_colour;
new_pixel_colour[0] = 255; //Blue channel
new_pixel_colour[1] = 255; //Green channel
new_pixel_colour[2] = 255; //Red channel
运算符中的类型也更改为.at
。更正后的代码如下。
cv::Vec3b
另一种绘图解决方案是使用OpenCV的内置绘图功能。具体来说,要绘制矩形,可以使用OpenCV函数//--Block Mask--//
block_mask = cv::Mat::zeros(image_height, image_width, CV_8UC3);
cv::Vec3b new_pixel_colour;
new_pixel_colour[0] = 255; //Blue channel
new_pixel_colour[1] = 255; //Green channel
new_pixel_colour[2] = 255; //Red channel
int img_height = block_mask.rows;
int img_width = block_mask.cols;
for (int row = (img_height / 2); row < ((img_height / 2) + 1); row++)
{
for (int column = 0; column < img_width; column++)
{
block_mask.at<cv::Vec3b>(row, column) = new_pixel_colour;
}
}
cv::namedWindow("Block Mask", CV_WINDOW_AUTOSIZE);
cv::imshow("Block Mask", block_mask);
。可以在以下位置找到有关OpenCV中基本绘图的教程:https://docs.opencv.org/master/d3/d96/tutorial_basic_geometric_drawing.html