OpenCV,Android:从图像中检测对象而不是实时检测

时间:2017-06-19 06:53:19

标签: android c++ android-studio opencv

我正在创建一个Android应用程序,可以从视频中捕获的图像帧中检测对象。

openCV中的示例应用程序仅提供实时检测示例。

其他信息: - 我正在使用Haar分类器

截至目前,我已经存储了在ImageView数组中捕获的帧,如何使用OpenCV检测对象并在其周围绘制一个矩形?

for(int i=0 ;i <6; i++)
        {
            ImageView imageView = (ImageView)findViewById(ids_of_images[i]);

            imageView.setImageBitmap(retriever.getFrameAtTime(looper,MediaMetadataRetriever.OPTION_CLOSEST_SYNC));
            Log.e("MicroSeconds: ", ""+looper);
            looper +=10000;
        }

1 个答案:

答案 0 :(得分:3)

我希望你在你的项目中集成了opencv 4 android库。 现在,您可以使用opencv函数将图像转换为Mat

Mat srcMat = new Mat();
Utils.bitmapToMat(yourbitmap,srcMat);

一旦你有了mat,就可以应用opencv函数从图像中找到矩形对象。 现在,按照代码检测矩形:

Mat mGray = new Mat();
cvtColor(mRgba, mGray, Imgproc.COLOR_BGR2GRAY, 1);
Imgproc.GaussianBlur(mGray, mGray, new Size(3, 3), 5, 10, BORDER_DEFAULT);
Canny(mGray, mGray, otsu_thresold, otsu_thresold * 0.5, 3, true); // edge detection using canny edge detection algorithm
List<MatOfPoint> contours = new ArrayList<>();
Mat hierarchy = new Mat();
Imgproc.findContours(mGray,contours,hierarchy,Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

现在,你有来自图像的轮廓。因此,您可以从中获取最大轮廓并使用drawContour()方法绘制它:

for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++){
Imgproc.drawContours(src, contours, contourIdx, new Scalar(0, 0, 255)-1);
}

你已经完成了!!你可以参考这个链接: Android using drawContours to fill region

希望它会有所帮助!!