基于JavaCamera2View组件类
javaCamera2View.setCameraIndex(0); //使用那个摄像头 后置 前置
javaCamera2View.setCameraPermissionGranted(); // 摄像头权限问题
javaCamera2View.enableFpsMeter(); // 显示帧率
javaCamera2View.enableView(); // 开启
javaCamera2View.disableView(); //关闭 与开启成对出现 注意周期
javaCamera2View.setCvCameraViewListener(new CvCameraViewListener2()); //回调监听
private class CvCameraViewListener2__ implements CameraBridgeViewBase.CvCameraViewListener2 {
@Override
public void onCameraViewStarted(int width, int height) {
}
@Override
public void onCameraViewStopped() {
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
Mat src = inputFrame.rgba(); // 摄像头获取到的图像 是横向的
//可以调用任意方法改变图像 改变尺寸时要注意 CameraBridgeViewBase 中有图像的缓存不一致会报错
return src;
}
}
···
//竖屏摄像头旋转问题
protected void deliverAndDrawFrame(CvCameraViewFrame frame) {
Mat modified;
if (mListener != null) {
modified = mListener.onCameraFrame(frame);
} else {
modified = frame.rgba();
}
boolean bmpValid = true;
if (modified != null) {
try {
Utils.matToBitmap(modified, mCacheBitmap);
} catch(Exception e) {
Log.e(TAG, "Mat type: " + modified);
Log.e(TAG, "Bitmap type: " + mCacheBitmap.getWidth() + "*" + mCacheBitmap.getHeight());
Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage());
bmpValid = false;
}
}
if (bmpValid && mCacheBitmap != null) {
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
if (BuildConfig.DEBUG)
Log.d(TAG, "mStretch value: " + mScale);
// ===修改这里解决预览旋转90度问题
canvas.rotate(90,0,0);
float scale = canvas.getWidth() / (float)mCacheBitmap.getHeight();
float scale2 = canvas.getHeight() / (float)mCacheBitmap.getWidth();
if(scale2 > scale){
scale = scale2;
}
if (scale != 0) {
canvas.scale(scale, scale,0,0);
}
canvas.drawBitmap(mCacheBitmap, 0, -mCacheBitmap.getHeight(), null);
// ===结束这里解决预览旋转90度问题end
if (mFpsMeter != null) {
mFpsMeter.measure();
mFpsMeter.draw(canvas, 20, 30);
}
getHolder().unlockCanvasAndPost(canvas);
}
}
}
···
//改变尺寸 旋转 报错的问题 JavaCamera2View的父类 CameraBridgeViewBase类中
protected void deliverAndDrawFrame(CvCameraViewFrame frame) {
...
//在方法内部 最后添加
if (mCacheBitmap != null) { //
mCacheBitmap.recycle();
mCacheBitmap = Bitmap.createBitmap(modified.width(), modified.height(), Bitmap.Config.ARGB_8888);
}
}
Size szAfter = new Size(640, 480); // Scale back down to 640x480 (original dim.)
Imgproc.resize(result, result, szAfter); //改变尺寸
Core.rotate(result, result, Core.ROTATE_90_CLOCKWISE); //横屏
网友评论