我刚刚开始使用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;
你就完成了!!