c++ - 像素在 OpenCV 中设置不正确

标签 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。这让我想知道这是否与显示的图像有关?当简单地将单个像素(不是循环中的像素)设置为白色超过线条到达的位置时,也看不到任何结果。

我对这里发生的事情一头雾水,因此非常感谢任何帮助,或者更好的方法来实现这一目标。

最佳答案

已解决:图像 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/

相关文章:

c++ - C++ 和 QT 中的 MVC 和主题观察者模式

c++ - CV_32FC1 转位图

opencv - 使用 OpenCV 分割图像

opencv - brew 链接 jpeg 问题

c++ - 在 C++ 中重载运算符时 "const"是什么意思

c++ - 当你在类中使用 fwrite() 时会发生什么?

c++ - 愚蠢的 C++ 语法尚未声明

c++ - 密码验证程序代码,处理 C++ cstrings

c++ - #在opencv中包含C++头文件

java - 通过多个图像的 3D 点云结果是几条线