Android OpenCV 相机旋转90°问题解决(本文缺胳膊断腿,个人处理方法留存,慎点)

Android OpenCV接入后竖屏JavaCameraView旋转90°问题解决(本文缺胳膊断腿,个人处理方法留存,慎点)

这篇博客只是留个临时的处理方法,如果大神们有其他方法来分享分享喔。

首先,JavaCameraView进行人脸识别、人眼检测的时候,默认需要横屏,如果竖屏,并且直接在CvCameraViewListener2的onCameraFrame方法中直接旋转inputFrame,将会有crash的问题

javaCameraView.setCvCameraViewListener(new CameraBridgeViewBase.CvCameraViewListener2() {
                    @Override
                    public void onCameraViewStarted(int width, int height) {

                    }

                    @Override
                    public void onCameraViewStopped() {

                    }

                    @Override
                    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

                        Mat frame = inputFrame.rgba();
                        Mat model = new Mat();
                        Mat modelForImg = new Mat();
                        
                        Core.rotate(frame,model,Core.ROTATE_90_COUNTERCLOCKWISE);
                        Core.flip(model,model,1);

                        Core.rotate(frame,modelForImg,Core.ROTATE_90_COUNTERCLOCKWISE);
                        Core.flip(modelForImg,modelForImg,1);
                        img2 = Bitmap.createBitmap(modelForImg.cols(),modelForImg.rows(),Bitmap.Config.ARGB_8888);
                        Core.flip(frame, frame, 1);
                        process(model,modelForImg);
                        
                        return frame;
                        
                    }
                });

我简单解释一下代码,我们要知道,相机拿到的Mat是这个监听器返回的Mat,所以如果我们在代码中直接对该 Mat frame = inputFrame.rgba(); 的frame进行Core.rotate()旋转,将会出现问题

所以现在的思路是:取一个备份,这个备份是frame旋转到我们想要的角度得来的,把获得的备份mat交给process()方法(获取mat进行后处理操作的方法,不贴),后续处理mat的手段就对着备份mat处理, onCameraFrame返回的mat交给JavaCameraView自身进行绘制等操作。

网络上有直接修改源码进行旋转的,可以参考,但是仅仅是图片显示的旋转,我们希望竖屏获得的inputFrame就直接用来数据处理,就需要将frame进行旋转(转置、镜像),但是又不能直接在竖屏状态下对frame本身进行Core.rotate操作,所以我们用了备份mat

需要注意的是备份mat必须不为null 在rotate()方法中位于 dst 参数位置

我们可以在图像处理过程中通过Imgproc.rectangle()方法在备份的mat上绘制矩形,一切绘制完成以后,可以通过 matToBitmap 方法转成bitmap 然后再在ImageView上以竖屏垂直方向正常展示

要注意,JavaCameraView不可以0宽高,也不可不可视,因为onCameraFrame拿到的mat是来自屏幕上的图片(不确定,但应该是这样)

所以可以粗暴的在JavaCameraView上面盖上一层,假装没有JavaCameraView。虽然关于绘制 内存优化等方面完全不符合要求,但是也算是完成任务。

这个只是第一次接触的想法,后续深入接触应该会收获到更好的合适的处理办法。

原创文章 23 获赞 28 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43093006/article/details/98370872
今日推荐