【问题标题】:Displaying image and converting to grayscale - OpenCV for Android, Java API显示图像并转换为灰度 - OpenCV for Android, Java API
【发布时间】:2012-08-10 02:13:08
【问题描述】:

我正在 Eclipse 中编写一个使用 OpenCV4Android API 的 Android 应用程序。如何轻松显示Mat 图像,仅用于调试?在 C++ 中,根据 OpenCV 教程,您可以执行以下操作:

namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display.
imshow( "Display window", image ); // Show our image inside it.

但适用于 Android 的 Java API 似乎在 org.opencv.highgui.Highgui 内没有 namedWindow 函数。

另外,我想将图像加载为灰度。在 C++ 中,根据imread not working in Opencv,你会这样做:

imread("blackandwhite.jpg", 0);

但 Java API 的 Highgui.imread() 只有文件名参数。

【问题讨论】:

    标签: java android image opencv


    【解决方案1】:

    但 Android 的 Java API 似乎没有命名窗口 org.opencv.highgui.Highgui 中的函数。

    因为您必须在View 上显示您的图像。查看来自 WEB 的示例。

    另外,我想将图像加载为灰度。

    使用 cvCvtColor 和代码 CV_BGR2GRAY 进行此类转换。

    【讨论】:

    • 我没有使用 JavaCV,它是 OpenCV 的第三方包装器。相反,我使用的是适用于 Android 的 OpenCV,它的语法与 C++/JavaCV 不同。感谢有关 cvCvtColor 的提示 - 这使我找到了灰度转换的解决方案,即 Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY)。不过,我不知道您在 View 上显示图像是什么意思。你能详细说明一下吗?
    • @user1397061 javacv 有在设备上显示图像的示例。同样正如我已经说过的,WEB中有很多例子。
    • Highgui.imwrite("/image.jpg", mat) 可以解决问题,但实际上并没有显示图像 - 它只是将其保存到文件中。 JavaCV 使用画布框架,这在其他任何地方似乎都不存在。您介意发布一个指向 OpenCV4Android 示例的链接吗?
    • OpenCV 包包含文件夹samples
    【解决方案2】:

    总结:

    将图像转换为灰度:Imgproc.cvtColor(image, image, Imgproc.COLOR_BGR2GRAY);

    显示图片:见herehere

    【讨论】:

      【解决方案3】:

      这是一个示例代码,它将使用 OpenCV 在 imageView 中显示图像(必须在可绘制文件夹中包含图像):

       ImageVIew imgView = (ImageView) findViewById(R.id.sampleImageView);
              Mat mRgba = new MAt();
              mRgba = Utils.loadResource(MainAct.this, R.drawable.your_image,Highgui.CV_LOAD_IMAGE_COLOR);
              Bitmap img = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(),Bitmap.Config.ARGB_8888);
              Utils.matToBitmap(mRgba, img);
              imgView.setImageBitmap(img);
      

      并且 xml 必须有一个 ImageView 如下:

      <ImageView
              android:id="@+id/sampleImageView"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_centerHorizontal="true"/>
      

      希望这有助于解决您的问题..

      【讨论】:

        【解决方案4】:

        虽然这不处理图像的显示,但这里有一个快速的纯 java 静态方法,通过文件路径读取图像,然后将其转换(并写入)为灰度。

        /**
         * Get an OpenCV matrix from an image path and write the image as grayscale.
         * @param filePath The image path.
         * @return The matrix.
         */
        public static Mat loadOpenCvImage(final String filePath) {
            Mat imgMat = Highgui.imread(filePath, Highgui.CV_LOAD_IMAGE_GRAYSCALE);
            if (imgMat == null) {
                Log.e(TAG, "error loading file: " + filePath);
            } else {
                Log.d(TAG, "Ht: " + imgMat.height() + " Width: " + imgMat.width());
                final String outPath = filePath + "_gray.jpg";
                Log.d(TAG, outPath);
                Highgui.imwrite(outPath, imgMat);
            }
            return imgMat;
        }
        

        【讨论】:

          猜你喜欢
          • 2013-05-09
          • 2017-09-12
          • 1970-01-01
          • 1970-01-01
          • 2015-10-07
          • 2018-09-23
          • 2015-05-28
          • 2017-08-30
          相关资源
          最近更新 更多