我正在开发一个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();
提前感谢您的帮助!
答案 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帧!应用程序可能在其上做了太多工作 主线。