我正在尝试制作一个完全黑色的图像,除了图像中心的白色矩形。然而,在我第一次尝试时,我得到了一个奇怪的结果,所以我更改了我的代码来确定问题。
因此,对于 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
。这让我想知道这是否与显示的图像有关?当简单地将单个像素(不是循环中的像素)设置为白色超过线条到达的位置时,也看不到任何结果。
我对这里发生的事情一头雾水,因此非常感谢任何帮助,或者更好的方法来实现这一目标。
最佳答案
已解决:图像 block_mask
是一个三 channel BGR 图像,因为它是使用 CV_8UC3
类型创建的。但是,当将像素值设置为白色时,使用了 uchar
类型。此外,这被设置为值 255 的信号整数类型。
要正确设置每个像素的颜色,必须设置所有三个 channel 。这可以使用 cv::Vec3b
类型变量来实现,该变量包含每个 channel 的值并且可以单独设置。这可以通过以下方式完成:
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
。更正后的代码如下。
//--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 的内置绘图功能。具体来说,要绘制矩形,可以使用 OpenCV 函数 cv::rectangle()
。可以在此处找到有关 OpenCV 基本绘图的教程:https://docs.opencv.org/master/d3/d96/tutorial_basic_geometric_drawing.html
关于c++ - 像素在 OpenCV 中设置不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51570677/