在OpenCV中未正确设置像素

时间:2018-07-28 10:56:54

标签: c++ opencv

我正在尝试制作一张全黑的图像,除了图像中心的白色矩形之外。但是,在第一次尝试时,我得到了一个奇怪的结果,所以我更改了代码以查明问题所在。

因此,对于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.

使用此代码,我希望看到在整个图像上绘制一条白线,但是,白线仅在图像的一部分上延伸。参见下图。 Horizontal White Line

要进行故障排除,我创建了一个变量以计算内部for循环的迭代次数,并且按我的预期,它最多计数到1920。这让我想知道是否与显示的图像有关?当简单地将单个像素(不是循环地)设置为到达行所在位置的白色时,也看不到结果。

我对这里发生的事情不知所措,因此,将不胜感激任何帮助或实现此目的的更好方法。

1 个答案:

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