gpt4 book ai didi

c++ - Create mask from color Image in C++(叠加彩色图像蒙版)

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:48 26 4
gpt4 key购买 nike

我编写了一个代码,可以实时检测正方形(白色)并在其周围绘制一个框。正方形的每条边长l被分成7份。然后我在从垂直于三角形边(蓝色)的偏差演变而来的六个点中的每一个处绘制一条长度为 h=l/7 的线。角落用红色标记。然后它看起来像这样:

enter image description here

为了绘制蓝色线条和圆圈,我有一个 3 channel (CV_8UC3) 矩阵 drawing,除了红色、蓝色的位置外,其他地方都为零和白线。然后我使用 opencv 的 addWeighted 函数将这个矩阵放置在我的网络摄像头图像上。addWeighted( drawing, 1, webcam_img, 1, 0.0, dst); ( Description for addWeighted here )。但是,正如您所看到的,我得到的效果是我的破折号和圆圈的颜色在黑色区域之外是错误的(可能在黑色区域内也不正确,但在那里更好)。它发生的原因完全有道理,因为它只是为矩阵添加了权重。

我想在我的图像上绘制具有正确颜色的矩阵绘图。问题是,我不知道如何修复它。我不知何故需要一个蒙版 drawing_mask ,我的破折号在某种程度上叠加到我的相机图像上。在 Matlab 中类似 dst=webcam_img; dst(绘图>0)=绘图(绘图>0);

有人知道如何在 C++ 中执行此操作吗?

最佳答案

1。自定义版本

我会明确地写出来:

const int cols = drawing.cols;
const int rows = drawing.rows;

for (int j = 0; j < rows; j++) {
const uint8_t* p_draw = drawing.ptr(j); //Take a pointer to j-th row of the image to be drawn
uint8_t* p_dest = webcam_img.ptr(j); //Take a pointer to j-th row of the destination image
for (int i = 0; i < cols; i++) {
//Check all three channels BGR
if(p_draw[0] | p_draw[1] | p_draw[2]) { //Using binary OR should ease the optimization work for the compiler
p_dest[0] = p_draw[0]; //If the pixel is not zero,
p_dest[1] = p_draw[1]; //copy it (overwrite) in the destination image
p_dest[2] = p_draw[2];
}
p_dest += 3; //Move to the next pixel
p_draw += 3;
}
}

当然,您可以在带参数的函数中移动此代码 (const cv::Mat& drawing, cv::Mat& webcam_img) .

2。 OpenCV“纯粹”版本

但纯粹的 OpenCV 方式如下:

cv::Mat mask;
//Create a single channel image where each pixel != 0 if it is colored in your "drawing" image
cv::cvtColor(drawing, mask, CV_BGR2GRAY);
//Copy to destination image only pixels that are != 0 in the mask
drawing.copyTo(webcam_img, mask);

效率较低(创建 mask 的颜色转换在某种程度上很昂贵),但肯定更紧凑。小提示:如果你有一种非常深的颜色,它就不起作用,比如 (0,0,1)灰度图将转换为 0 .


另请注意,在目标图像中重新绘制相同的叠加层(线、圆)可能会更便宜,基本上调用与创建 drawing 时相同的绘制操作。图片。

关于c++ - Create mask from color Image in C++(叠加彩色图像蒙版),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29955131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com