java - onPictureTaken() 错误,问题是无法将 RGB 转换为灰色,程序停止从 cvtcolor() 函数运行。?

标签 java android opencv transform distance

嘿伙计们,我在使用这个函数时遇到了麻烦,这个函数在照片捕获后被调用,现在我想使用图像数据进行距离变换。并计算我知道问题出在哪里但我无法解决它的对象的确切数量,我认为问题出在 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 Log 我猜是 320x240。在 Android 中,捕获通常不是 RGBA 而是 YV12;因此 size=width x height x bits_per_pixel = 320 x 240 x 1.5 = 115200。在那种情况下,您使用了错误的转换格式,您应该使用 1 channel 输入 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 顺便说一句)。我想我记得在 cvtColor 中没有从 YUV 到 Gray 的直接转换,在这种情况下,您可以遍历输入缓冲区并通过周围的任何公式转换它,这会很慢,或者运行上面的代码(已翻译成 Java),然后执行另一个从 RGB 到灰色的 cvtColor

关于java - onPictureTaken() 错误,问题是无法将 RGB 转换为灰色,程序停止从 cvtcolor() 函数运行。?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22377093/

相关文章:

非根设备上的Android用户空间文件系统驱动程序?

python - Sobel 运算符的 Opencv 意外输出

opencv - 如何在ubuntu(或其他linux env)中将realsense RGB帧转换为cv::Mat?

Java 8 可选的 asSet()

java - 如何获取LinearLayout的X和Y坐标?

java - 关键部分在 onSensorChanged() 中不起作用

python - 为除一个元素外的整个图像添加透明度

java - 从另一个类中的方法创建 Action 监听器

java - 创建颜色函数

android - 需要有关 Android 声音处理的帮助/建议