【问题标题】:Overlay a image over live frame - OpenCV4Android在实时帧上叠加图像 - OpenCV4Android
【发布时间】:2019-06-18 19:50:24
【问题描述】:

我正在尝试在实时帧上覆盖用户先前选择的小图像。我已经从以前的活动中获得了图像的路径。我的问题是我无法在框架上显示图像。

我正在尝试检测框架上的矩形,并在矩形上显示所选图像。我可以检测到矩形,但现在我无法在框架的任何部分显示图像(我现在不关心矩形)。 我一直在尝试使用 Adding Image Overlay OpenCV for Androidadd watermark small image to large image opencv4android 的解释来做到这一点,但它对我没有用。

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

        Mat gray = inputFrame.gray();
        Mat dst = inputFrame.rgba();

        Imgproc.pyrDown(gray, dsIMG, new Size(gray.cols() / 2, gray.rows() / 2));
        Imgproc.pyrUp(dsIMG, usIMG, gray.size());

        Imgproc.Canny(usIMG, bwIMG, 0, threshold);

        Imgproc.dilate(bwIMG, bwIMG, new Mat(), new Point(-1, 1), 1);

        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();

        cIMG = bwIMG.clone();

        Imgproc.findContours(cIMG, contours, hovIMG, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);


        for (MatOfPoint cnt : contours) {

            MatOfPoint2f curve = new MatOfPoint2f(cnt.toArray());

            Imgproc.approxPolyDP(curve, approxCurve, 0.02 * Imgproc.arcLength(curve, true), true);

            int numberVertices = (int) approxCurve.total();

            double contourArea = Imgproc.contourArea(cnt);

            if (Math.abs(contourArea) < 100) {
                continue;
            }

            //Rectangle detected
            if (numberVertices >= 4 && numberVertices <= 6) {

                List<Double> cos = new ArrayList<>();

                for (int j = 2; j < numberVertices + 1; j++) {
                    cos.add(angle(approxCurve.toArray()[j % numberVertices], approxCurve.toArray()[j - 2], approxCurve.toArray()[j - 1]));
                }

                Collections.sort(cos);

                double mincos = cos.get(0);
                double maxcos = cos.get(cos.size() - 1);

                if (numberVertices == 4 && mincos >= -0.3 && maxcos <= 0.5) {

                     //Small watermark image
                    Mat a = imread(img_path);

                    Mat bSubmat = dst.submat(0, dst.rows() -1 , 0, dst.cols()-1);
                    a.copyTo(bSubmat);


                }
            }

        }

        return dst;

    }

注意:img_path 是我要在框架上显示的所选图像的路径。我是从之前的活动中得到的。

现在,我只想在框架上显示图像。稍后,我将尝试在找到矩形的相同位置显示它。 拜托,欢迎任何建议或建议,因为我是 OpenCV 的新手。我对我的英语感到抱歉,但如果我没有正确解释,请随时问我。我会尽力解释得更好。 非常感谢!

【问题讨论】:

    标签: android opencv4android


    【解决方案1】:

    如果您只想将图像显示为叠加层,而不是将其保存为视频的一部分,您可能会发现将其简单地显示在视频视图上方的单独视图中会更容易。这可能会使用更少的处理、电池等。

    如果您想在相机图像位图上绘图,那么以下内容将允许您这样做:

       Bitmap cameraBitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length, opt);
                Canvas camImgCanvas = new Canvas(cameraBitmap);
                Drawable d = ContextCompat.getDrawable(getActivity(), R.drawable.myDrawable);
                //Centre the drawing
                int bitMapWidthCenter = cameraBitmap.getWidth()/2;
                int bitMapheightCenter = cameraBitmap.getHeight()/2;
                d.setBounds(bitMapWidthCenter, bitMapheightCenter, bitMapWidthCenter+d.getIntrinsicWidth(),
                        bitMapheightCenter+d.getIntrinsicHeight());
                //And draw it...
                d.draw(camImgCanvas);
    

    【讨论】:

    • 好的,我会进一步调查你的想法。我想使用 OpenCV4Android,因为我的最终想法是用所选图像替换检测到的矩形。但如果你的想法对我来说很好,我会告诉你的。非常感谢!
    • @LucianoRuizMorales - 以防万一不清楚 - 上面的代码将允许您将图像直接添加到捕获的帧中,然后您可以保存它,如果您确定这是您想要的方式去。
    • 感谢您的解释!我会试试你的建议。你能给我的一切我都会试一试。
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-02-19
    相关资源
    最近更新 更多