Я использую OpenCV 3.4.2 Я создаю простое приложение для обнаружения бумаги. Пока я пытаюсь захватить CameraBridgeViewBase.CvCameraViewFrame inputFrame
преобразование матового изображения в растровое, я не могу достичь высокого разрешения. Мои снимки всегда дают мне разрешение 600x800. Я пробовал cameraBridgeViewBase.setMaxFrameSize()
, не получилось. Я пытался написать свой собственный класс View, но не смог его реализовать. Может кто-нибудь помочь мне? Спасибо.
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
this.inputFrame = inputFrame.rgba();
System.out.println(this.inputFrame.width()+"***"+this.inputFrame.height());
globalMat=this.inputFrame.clone();
if (startCanny) {
quadrilateral=DetectPaper.findDocument(this.inputFrame); //contour ve pointleri bulan fonksiyon
if (quadrilateral!=null){
//findocument hareketli bir görüntüden frame frame görüntüleri çekerken dörtgen bulamazsa nullPointer exception ile
//karşılaşıyor o yüzden objeyi kontrol etmek gerekiyor
//draw contour bulduğumuz contourları çiziyor
//Imgproc.drawContours(this.inputFrame,quadrilateral.contour,1,new Scalar(0,255,0),3);
//Her köşe için pointleri çizdiriyoruz
for (int i=0;i<quadrilateral.points.length;i++){
Imgproc.drawMarker(this.inputFrame,quadrilateral.points[i],new Scalar(255,0,0),Imgproc.MARKER_STAR,16);
}
}
}
return this.inputFrame;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cameraBridgeViewBase = (JavaCameraView)findViewById(R.id.my_camera);
cameraBridgeViewBase.setVisibility(SurfaceView.VISIBLE);
cameraBridgeViewBase.setCvCameraViewListener(this);
cameraBridgeViewBase.enableFpsMeter();
//System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
baseLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
super.onManagerConnected(status);
switch(status){
case BaseLoaderCallback.SUCCESS:
cameraBridgeViewBase.enableView();
break;
default:
super.onManagerConnected(status);
break;
}
}
};
checkPermission();
}
public static Bitmap captureBitmap(){
Core.flip(globalMat.t(),globalMat,1); // Dik ekrandayken Mat 90 derece sağa yatık olduğu için döndürüyoruz
quadrilateral=DetectPaper.findDocument(globalMat); // FAB ve perspective için tekrar point noktalarını buluyoruz
}
//İleride bunu çizdirmek yerine butonların kordinatlarını belirlemek için kullanacağız
Bitmap bitmap= Bitmap.createBitmap(globalMat.width(),globalMat.height(),Bitmap.Config.ARGB_8888);
try {
bitmap = Bitmap.createBitmap(globalMat.cols(), globalMat.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(globalMat, bitmap);
}catch(Exception ex){
System.out.println(ex.getMessage());
}
return bitmap;
}
И здесь мой класс CameraBridgeViewBase меняется. Я меняю метод deliverAndDrawFrame()
из-за полноэкранного режима.
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) {
int saveCount = canvas.save();
canvas.setMatrix(mMatrix);
mScale = Math.max((float) canvas.getHeight() / mCacheBitmap.getWidth(), (float) canvas.getWidth() / mCacheBitmap.getHeight());
canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);
Log.d(TAG, "mStretch value: " + mScale);
if (mScale != 0) {
canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2),
(int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2),
(int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2 + mScale*mCacheBitmap.getWidth()),
(int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2 + mScale*mCacheBitmap.getHeight())), null);
} else {
canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()),
new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,
(canvas.getHeight() - mCacheBitmap.getHeight()) / 2,
(canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(),
(canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null);
}
canvas.restoreToCount(saveCount);
if (mFpsMeter != null) {
mFpsMeter.measure();
mFpsMeter.draw(canvas, 20, 30);
}
getHolder().unlockCanvasAndPost(canvas);
}
}
}
@Override
public void layout(int l, int t, int r, int b) {
super.layout(l, t, r, b);
updateMatrix();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
updateMatrix();
}
private void updateMatrix() {
float hw = this.getWidth() / 2.0f;
float hh = this.getHeight() / 2.0f;
boolean isFrontCamera = Camera.CameraInfo.CAMERA_FACING_FRONT == mCameraIndex;
mMatrix.reset();
if (isFrontCamera) {
mMatrix.preScale(-1, 1, hw, hh);
}
mMatrix.preTranslate(hw, hh);
if (isFrontCamera)
mMatrix.preRotate(270);
else
mMatrix.preRotate(90);
mMatrix.preTranslate(-hw, -hh);
}