OpenCV

时间:2015-10-24 12:18:54

标签: c++ image opencv image-processing

我遇到矩阵逻辑运算问题。我想将bitwise_and与图像A和图像B一起使用以获得结果图像C.

图像数据类型都是Mat,图像A在某些功能之后被处理,它是具有3个通道的二进制图像。经过一些处理后,图像B也是一个二进制图像,但只有1个通道。

由于频道号不同,我在bitwise_and时会收到错误。

如何合并频道或其他任何方法来解决此问题?

这里显示图像A,B,C:

image A + image B = image C

3 个答案:

答案 0 :(得分:3)

您需要AB具有相同的尺寸,类型和频道数。您可以使用cvtColor从3转换为1个频道,反之亦然。这取决于C所需的类型:

Mat A; // CV_8UC3
Mat B; // CV_8UC1

如果您希望C成为3个频道:

cvtColor(B, B, COLOR_GRAY2BGR);
Mat C;
bitwise_and(A,B,C); // C will be 3 channel, CV_8UC3

否则,如果您希望C成为1个频道:

cvtColor(A, A, COLOR_BGR2GRAY);
Mat C;
bitwise_and(A,B,C); // C will be 1 channel, CV_8UC1    

此外,如果您不需要使用面具,您只需执行以下操作:

Mat C = A & B;

答案 1 :(得分:1)

我喜欢 Java 中的以下内容。

阈值通道1。 webcam_image频道3.

OPENCV 3.0

// convert 3  channel
Imgproc.cvtColor(thresholded, thresholded, Imgproc.COLOR_GRAY2BGR);
Core.bitwise_and(thresholded, webcam_image, webcam_image);

也许它会帮助你。

答案 2 :(得分:1)

您可以拆分三个通道矩阵并按位"和操作"分别在每个频道上:

vector<Mat> channels(3);
// split img:
split(imageA, channels);

bitwise_and(channels[0], imageB, channels[0]);
bitwise_and(channels[1], imageB, channels[1]);
bitwise_and(channels[2], imageB, channels[2]);

然后合并通道以获得3通道Mat对象:

 merge(channels, imageC);