我正在使用 C++ 处理 OpenCV。我想创建一个具有 3 种颜色的图像:红色、白色和黑色。详细地说,根据某些条件,我希望背景为红色,然后是白色和黑色。
我遇到的问题是,当我将颜色设置为白色时,它会变成蓝色。
有人能知道为什么会这样以及如何解决吗?
这是我的代码:
//initial image total red
cv::Mat image(Size(w, h), CV_8UC3, cv::Scalar(0, 0, 255));
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
int pixel_v = (int)imggray.at<uchar>(i,j);
if (pixel_v < 200) {
int pixel_bl = (int)imgBool.at<uchar>(i, j);
if (pixel_bl > 200) {
//HERE A WANT WHITE PIXELS, but they are blue
image.at<Vec3b>(i, j) = (255, 255, 255);
}
else {
//black: this works
image.at<Vec3b>(i, j) = (0, 0, 0);
}
}
}
}
最佳答案
OpenCV使用图像格式BGR(Blue, Green Red)
当你写这行时:
image.at<Vec3b>(i, j) = (255, 255, 255);
它等价于:
image.at<Vec3b>(i, j) = (255);
(参见 this SO answer 解释原因。)
它只将第一个 channel 设置为最大,并且恰好是蓝色。
您需要做的是像这样编辑整个像素:
// get pixel
Vec3b color = image.at<Vec3b>(Point(x,y));
color[0] = 255;
color[1] = 255;
color[2] = 255;
// set pixel
image.at<Vec3b>(Point(x,y)) = color;
因此您的代码需要如下所示:
cv::Mat image(Size(w, h), CV_8UC3, cv::Scalar(0, 0, 255));
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
int pixel_v = (int)imggray.at<uchar>(i,j);
if (pixel_v < 200) {
int pixel_bl = (int)imgBool.at<uchar>(i, j);
if (pixel_bl > 200) {
//HERE A WANT WHITE PIXELS, but they are blue
Vec3b color = image.at<Vec3b>(Point(i,j));
color[0] = 255;
color[1] = 255;
color[2] = 255;
image.at<Vec3b>(Point(i,j)) = color;
}
else {
image.at<Vec3b>(i, j) = (0, 0, 0);
}
}
}
}
关于c++ - OpenCV 显示错误的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54887825/