onPictureTaken()出错,问题是无法将RGB转换为GRAY,程序停止从cvtcolor()函数运行。

嘿家伙我这个function遇到麻烦,这个function在拍照后调用,现在我想使用图像数据进行距离变换。 并计算我知道哪里有问题的对象的确切数量,但我无法解决它,我认为问题是在Imgproc.cvtColor(m,mGray,Imgproc.COLOR_BGRA2GRAY)当我调试程序停止运行此时所以请回答我,如果你找到了什么; 先感谢您

@Override public void onPictureTaken(byte[] data, Camera camera) { Log.i(TAG, "Divyesh Saving a bitmap to file"); // The camera preview was automatically stopped. Start it again. mCamera.startPreview(); Log.i(TAG, "Divyesh Start preview"); mCamera.setPreviewCallback(this); Log.i(TAG, "Divyesh Start preview callback"); // Write the image in a file (in jpeg format) try { FileOutputStream fos = new FileOutputStream(mPictureFileName); Log.i(TAG, "Divyesh FOS open"); fos.write(data); Log.i(TAG, "Divyesh FOS write"); Mat photo = new Mat(); Log.i(TAG, "Divyesh Mat photo = new Mat()"); photo.put(0, 0, data); Log.i(TAG, "Divyesh photo.put"); m = new Mat(photo.height(), photo.width(), CvType.CV_8U,new Scalar(4)); Log.i(TAG, "Divyesh Mat value of M and height width"); //Bitmap myBitmap32 = photo.copy(Bitmap.Config.ARGB_8888, true); //Utils.bitmapToMat(myBitmap32, m); Imgproc.cvtColor(m, mGray, Imgproc.COLOR_BGRA2GRAY); Log.i(TAG, "Divyesh CVTCOLOR"); Imgproc.distanceTransform(mGray, mBin, Imgproc.DIST_LABEL_PIXEL, 3); Core.normalize(mBin, mBin, 0, 1., Core.NORM_MINMAX); Imgproc.threshold(mBin, mBin, .5, 1., Imgproc.THRESH_BINARY); mBin.convertTo(dist_8u, CvType.CV_8U); hierarchy = new Mat(); temp = dist_8u; Imgproc.findContours(dist_8u, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); fu = contours.size(); Log.i(TAG, fu + "finally got no of objects"); fos.close(); } catch (java.io.IOException e) { Log.e("PictureDemo", "Exception in photoCallback", e); } } } 

和LOGCAT

 03-14 11:11:39.089: D/CameraBridge(2350): mStretch value: 1.0 03-14 11:11:39.109: D/JavaCameraView(2350): Preview Frame received. Frame size: 115200 03-14 11:11:39.149: D/CameraBridge(2350): mStretch value: 1.0 03-14 11:11:39.149: I/OCVSample::Activity(2350): onTouch event 03-14 11:11:39.159: I/Sample::Tutorial3View(2350): Taking picture 03-14 11:11:39.969: I/Sample::Tutorial3View(2350): Divyesh Saving a bitmap to file 03-14 11:11:40.209: I/Sample::Tutorial3View(2350): Divyesh Start preview 03-14 11:11:40.209: I/Sample::Tutorial3View(2350): Divyesh Start preview callback 03-14 11:11:40.219: I/Sample::Tutorial3View(2350): Divyesh FOS open 03-14 11:11:40.229: I/Sample::Tutorial3View(2350): Divyesh FOS write 03-14 11:11:40.229: I/Sample::Tutorial3View(2350): Divyesh Mat photo = new Mat() 03-14 11:11:40.229: I/Sample::Tutorial3View(2350): Divyesh photo.put 03-14 11:11:40.229: I/Sample::Tutorial3View(2350): Divyesh Mat value of M and height width 03-14 11:11:40.229: D/AndroidRuntime(2350): Shutting down VM 

你没有提到捕获大小,但从Frame size日志我猜是320×240。 在Android中,捕获通常不是RGBA而是YV12; 因此size=width x height x bits_per_pixel = 320 x 240 x 1.5 = 115200 。 在这种情况下,你使用了错误的转换格式,你应该使用1通道输入Mat (因为YV12被OpenCV解释为错误的,因为它是平面的)然后(这个代码是C ++,但你明白了):

 cv::Mat yv12_image(height, width, CV_8UC1, input_buffer); cv::Mat rgb_image; cv::cvtColor(yv12_image, rgb_image, CV_YUV2RGB_YV12); 

(小心RGB与BGR btw)。 我想我记得在cvtColor没有从YUV到Gray的直接转换,在这种情况下你可以走输入缓冲区并通过任何公式转换它,这会很慢,或运行上面的代码(翻译成Java)然后从RGB到Gray执行另一个cvtColor