【问题标题】:Threshold in Image Processing with OpenCV for Android not working使用 OpenCV for Android 进行图像处理的阈值不起作用
【发布时间】:2016-04-06 01:11:00
【问题描述】:

我正在开发一个使用 OpenCV 库进行图像处理来识别字符的 Android 应用程序。

我首先使用 Eclipse 用 Ja​​va 编写代码,现在我正在将代码传输到 Android Studio。我面临的问题是这条线似乎对Camera Preview没有任何影响,它显示的是没有效果的普通图像。

这是我的一些声明我的声明:

Mat rgba = inputFrame.rgba();
Size sizeRgba = rgba.size();

Mat rgbaInnerWindow;

int rows = (int) sizeRgba.height;
int cols = (int) sizeRgba.width;

int left = cols / 8;
int top = rows / 2;

int width = cols * 3 / 4;
int height = rows * 20 / 100;

rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);

以下是我应用的方法:

//Filtre Gaussien
Imgproc.GaussianBlur(mIntermediateMat, rgbaInnerWindow, new org.opencv.core.Size(7, 7), 0, 3);

//binarisation
Imgproc.threshold(mIntermediateMat, rgbaInnerWindow, 181, 255, Imgproc.THRESH_BINARY);

rgbaInnerWindow.release();

提前感谢您的帮助!

【问题讨论】:

  • 哪个函数包含阈值处理代码?
  • 这个:Imgproc.threshold(mIntermediateMat, rgbaInnerWindow, 181, 255, Imgproc.THRESH_BINARY);
  • 抱歉,重新措辞我的问题。在每帧调用的相机回调中是否存在 thershold 函数?
  • 对不起,之前误会你了。是的,它在相机回调中的每一帧都被调用。

标签: android opencv


【解决方案1】:

问题解决了。我必须在处理之前对图像进行灰度化,所以我将 inputFrame.gray() 作为 GaussianBlur 函数中的第一个参数:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    Imgproc.GaussianBlur(inputFrame.gray(), mIntermediateMat, new org.opencv.core.Size(7, 7), 0 ,  3);
    Imgproc.threshold(mIntermediateMat, mRgba, 181, 255, Imgproc.THRESH_BINARY);

    return mRgba;
}

另外,在 Android Studio 中设置一个新的 OpenCV 项目消除了这些错误:

E/LoadedApk: onReceive 和 onReceive 时间太长 是:28051 毫秒意图是:意图 { act=android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE flg=0x4000010(有 额外)}

跳过了 38 帧!应用程序可能在其上做太多工作 主线程。

【讨论】:

    【解决方案2】:

    阈值函数作用于单通道图像,输出另一个单通道图像。由于您的 rgbaInnerWindow 是与输出尺寸不匹配的 4 通道 Mat,因此删除了它的引用并创建了一个新矩阵。所以显示rgba时看不到结果。

    试试这个:

    Imgproc.threshold(mIntermediateMat, mIntermediateMat, 181, 255, Imgproc.THRESH_BINARY);
    Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2RGBA);
    

    cvtColor() 的输出将与您的 rgbaInnerWindow 匹配,rgba 将被修改。

    您也可以使用Core.merge()在所有4个通道上复制单通道图像并将结果推送到rgbaInnerWindow

    【讨论】:

    • 感谢您的回答。完成此操作后,我的 Logcat 上有这些消息:E/ LoadedApk: It takes too much time onReceive and the onReceive time is:28051 ms intent is:Intent { act=android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE flg=0x4000010 (has extras) } Skipped 38 frames! The application may be doing too much work on its main thread.
    • GaussianBlur 可能是罪魁祸首。其他人不需要那么多时间。同时移动 onReceive 函数中发生的任何分配。
    • 谢谢。我会尽力做到这一点,我会给出我的反馈。但我很确定它不是 GaussianBlur 因为当我只让 GaussianBlur 函数时我没有这些错误。也许我应该在捕获后处理一个单一的图像,而不是处理每一帧。
    • 如果之前没有出现,请尝试使用合并方法。使处理远离 UI 线程会有所帮助,但这些不是非常复杂的图像处理任务,应该执行得相当快。你的情况有一些瓶颈。
    猜你喜欢
    • 1970-01-01
    • 2014-11-30
    • 2020-07-05
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多