OpenCV for Android无法运行的图像处理阈值

时间:2016-04-04 19:39:06

标签: android opencv

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

我首先使用Eclipse用Java编写代码,现在我将代码转移到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();

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

阈值功能适用于单通道图像并输出另一个单通道图像。由于您的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

答案 1 :(得分:0)

问题解决了。我必须在处理之前对图像进行灰度处理,因此我将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 ms意图是:意图{   act = android.net.conn.CONNECTIVITY_CHANGE_IMMEDIATE flg = 0x4000010(已   额外的)}

     

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