我的图像是CV_8UC3
类型(它是灰度图像),我需要它作为CV_8UC1
。如何进行转换?我已经试过了
Mat right = new Mat(rectRight.width(), rectRight.height(), CvType.CV_8UC1);
rectRight.convertTo(right, CvType.CV_8UC1,255,0);
但它仍然给了我一个 3 通道的图像。
RectLeft 是此图像的校正版本:
Imgproc.undistort(Highgui.imread(images[0], Imgproc.COLOR_BGR2GRAY), undist_left, cameraMatrix, distCoeff);
更正是使用以下部分代码完成的:
Mat rectLeft = new Mat();
Imgproc.initUndistortRectifyMap(cameraMatrix, distCoeff, R1, newCameraMatrix_left, left.size(), CvType. CV_32FC1, map1_left, map2_left);
Imgproc.remap(left, rectLeft, map1_left, map2_left, Imgproc.INTER_LANCZOS4);
校正后的图像(及其右侧相机的合作伙伴)应用于
StereoBM stereoAlgo = new StereoBM();
stereoAlgo.compute(left, right, disparity);
但是有一个例外,它说两个输入图像都应该是 CV_8UC1
型,但我已经检查过,rectLeft.type()
给了我 16。(我想这CV_8UC1
)。
您可能想要对StereoBM进行灰度转换:
Imgproc.cvtConvert(src,dst,Imgproc.COLOR_BGR2GRAY);
http://docs.opencv.org/java/org/opencv/imgproc/Imgproc.html#cvtColor(org.opencv.core.Mat,%20org.opencv.core.Mat,%20int,%20int)
(你不能用 Mat.convertTo() 改变/减少通道的数量,只能改变深度)
No, 16 是CV_8UC3
:
~ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.CV_8UC1
0
>>> cv2.CV_8UC3
16
>>>
您必须将其转换为灰度:
cvtColor(imageIn, imageOut, COLOR_BGR2GRAY);
参考资料:
void Mat::convertTo(Mat& m, int rtype, double alpha=1, double beta=0) const
rtype – 所需的目标矩阵类型,或者更确切地说,深度 (因为通道数将与源通道数相同)。 如果 rtype 为负数,则目标矩阵将具有相同的类型 作为来源。
或split
通道并仅获取其中一个通道,或使用threshold
转换为二进制图像
编辑:
有关如何在opencv中构建类型(如8UC1等)的完整答案,请参阅此处。
为了转换为灰度..谷歌它,它充满了很好的资源。记住参考文献 基本映像容器