OpenCV CV_8UC3到CV_8UC1

时间:2014-04-01 13:15:22

标签: java opencv

我的图片类型为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} })。

2 个答案:

答案 0 :(得分:6)

你可能想要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()改变/减少通道数,只能深度)

答案 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