OpenCV Android -精心制作人像模式的相机



我刚刚开始使用OpenCv,我现在使用没有c++头的android sdk。

我已经将示例导入sdk文件夹到我的android工作室,我遵循一些在线找到的提示使其工作。现在他们工作,我已经尝试过了,但所有的例子都有一个问题。它们显示相机预览,或者更好的是从相机精心制作的帧然后显示在显示器上,向右翻转90度,它们也是镜像的。

这对我来说很奇怪,我不能使它正常工作,我在网上读了很多提示,这是一个很常见的问题。

我已经尝试将setDisplayOrientation(90)放入JavaCameraView类,但它的工作只是为了显示相机预览,如果我试图在画布表面上写它被锁定并产生错误,因此我无法再详细说明框架。

我试图将onCameraFrame修改为我的主类,但如果我尝试用core.flip逐帧旋转相机,我会进入拉伸图像或黑屏。最后,这种方法由于逐帧细化,使得摄像机的响应速度很慢。

有人有这个问题吗?如何解决这个问题?是否有一种方法在OpenCv有相机的正确方向?

谢谢

我知道现在回答这个问题有点晚了,但是我终于找到了不会让相机画面变慢的解决方案。
您必须对默认的opencv类进行更改。1)在CameraBridgeViewBase类中添加以下代码

Matrix matrix = new Matrix();
matrix.setRotate(90f);
Bitmap bitmap = Bitmap.createBitmap(mCacheBitmap, 0, 0, mCacheBitmap.getWidth(), mCacheBitmap.getHeight(), matrix, true);

2)现在在drawbitmap方法中用mCacheBitmap替换上面的bitmap,如下图

if (mScale != 0) {
            canvas.drawBitmap(bitmap, new Rect(0,0,bitmap.getWidth(), bitmap.getHeight()),
                    new Rect((int)((canvas.getWidth() - mScale*bitmap.getWidth()) / 2),
                            (int)((canvas.getHeight() - mScale*bitmap.getHeight()) / 2),
                            (int)((canvas.getWidth() - mScale*bitmap.getWidth()) / 2 + mScale*bitmap.getWidth()),
                            (int)((canvas.getHeight() - mScale*bitmap.getHeight()) / 2 + mScale*bitmap.getHeight())), null);
        } else {
 canvas.drawBitmap(bitmap, new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()),
                    new Rect((canvas.getWidth() - bitmap.getWidth()) / 2,
                            (canvas.getHeight() - bitmap.getHeight()) / 2,
                            (canvas.getWidth() - bitmap.getWidth()) / 2 + bitmap.getWidth(),
                            (canvas.getHeight() - bitmap.getHeight()) / 2 + bitmap.getHeight()), null);

}

3)现在,在您的JavaCameraView类中替换initializeCamera方法中的以下代码(更改纵向模式的高度,宽度)

if ((getLayoutParams().width == ActionBar.LayoutParams.MATCH_PARENT) && (getLayoutParams().height == ActionBar.LayoutParams.MATCH_PARENT))
                mScale = Math.min(((float)height)/mFrameWidth, ((float)width)/mFrameHeight); 
            else
                mScale = 0;

你就完成了!!

相关内容

  • 没有找到相关文章

最新更新