我的图片类型为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.(我猜这是{{1} })。
答案 0 :(得分:6)
你可能想要StereoBM的灰度转换:
Imgproc.cvtConvert(src,dst,Imgproc.COLOR_BGR2GRAY);
(你不能用Mat.convertTo()改变/减少通道数,只能深度)
答案 1 :(得分:3)
不,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等)的完整答案,请参阅this。
要转换为灰度..谷歌,它充满了良好的资源。请记住参考The basic image container