如何从相机预览android opencv中提取对象 [英] how to extract an object from the camera preview android opencv

查看:56
本文介绍了如何从相机预览android opencv中提取对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 android 上使用 OpenCV 扫描 MTG 卡.我有它,我可以检测卡片的边缘,甚至在它周围画一个轮廓,但我对如何从背景中提取卡片然后退出相机预览感到困惑.到目前为止,这是我的代码:

I am trying to scan a MTG card using OpenCV on android. I have it to where I can detect the edges of the card and even draw an outline around it but am confused on how to extract just the card from the background and then exit from the camera preview. Here is my code so far:

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    Mat result = new Mat();
    Mat mask = new Mat();
    List<MatOfPoint> contours = new ArrayList<>();
    Mat hierarchy = new Mat();
    mRgba = inputFrame.rgba();
    Imgproc.Canny(mRgba, result, 40, 120);
    Imgproc.GaussianBlur(result, result, new Size(9,9), 2, 2);
    Imgproc.findContours(result, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0));
    Imgproc.drawContours(mask, contours, -1, new Scalar(0, 255, 0), 1);
    hierarchy.release();

    for ( int contourIdx=0; contourIdx < contours.size(); contourIdx++ )
    {
        // Minimum size allowed for consideration
        MatOfPoint2f approxCurve = new MatOfPoint2f();
        MatOfPoint2f contour2f = new MatOfPoint2f( contours.get(contourIdx).toArray() );
        //Processing on mMOP2f1 which is in type MatOfPoint2f
        double approxDistance = Imgproc.arcLength(contour2f, true)*0.02;
        Imgproc.approxPolyDP(contour2f, approxCurve, approxDistance, true);

        //Convert back to MatOfPoint
        MatOfPoint points = new MatOfPoint( approxCurve.toArray() );

        // Get bounding rect of contour
        Rect rect = Imgproc.boundingRect(points);

        Imgproc.rectangle(mRgba, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(255, 0, 0, 255), 3);
    }
    Bitmap card = Bitmap.createBitmap(result.cols(), result.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(result, card);
    return mRgba;
}

}

这是运行代码时的示例.正如您所看到的,卡片现在由一个红色矩形勾勒出来,但是我如何提取矩形中的内容,将其保存到一个垫子或位图,然后退出相机?概述卡片的屏幕截图

Here is an example of what it looks like when run the code. As you can see the card is outlined by a red rectangle now but how do I extract just whats in the rectangle, save it to a mat or bitmap and then exit the camera? screenshot of outlined card

推荐答案

我没测试过,但是你不能直接用...

I didn't test it, but can't you just use...

return new Mat(mRgba, rect);

这篇关于如何从相机预览android opencv中提取对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆