簡體   English   中英

src.type() == CV_8UC1 圖像去歪斜時斷言失敗

[英]src.type() == CV_8UC1 assertion failed when deskewing image

我的目標是實現圖像糾偏,我正在使用 OpenCV。 我的第一步是將位圖轉換為 Mat,然后我使用函數computeSkew(matImg) ,如下所示。 不幸的是,這不起作用,因為我收到以下錯誤消息。 請幫我解決問題。

Bitmap bitmap = bitmapDrawable.getBitmap();
Mat matImg = new Mat();
Bitmap bmp32 = bitmap.copy(Bitmap.Config.ARGB_8888, true);

Utils.bitmapToMat(bmp32, matImg);

computeSkew(matImg);
public Mat deskew(Mat src, double angle) {
       Point center = new Point(src.width()/2, src.height()/2);
       Mat rotImage = Imgproc.getRotationMatrix2D(center, angle, 1.0);
       Size size = new Size(src.width(), src.height());
       Imgproc.warpAffine(src, src, rotImage, size, Imgproc.INTER_LINEAR + Imgproc.CV_WARP_FILL_OUTLIERS);
       return src;
   }

public void computeSkew(Mat img) {

       Imgproc.threshold( img, img, 200, 255, THRESH_BINARY );

       
       Core.bitwise_not( img, img );
       Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));

       Imgproc.erode(img, img, element);

       Mat wLocMat = Mat.zeros(img.size(),img.type());
       Core.findNonZero(img, wLocMat);

       MatOfPoint matOfPoint = new MatOfPoint( wLocMat );

       MatOfPoint2f mat2f = new MatOfPoint2f();
       matOfPoint.convertTo(mat2f, CvType.CV_32FC2);

       RotatedRect rotatedRect = Imgproc.minAreaRect( mat2f );

       Point[] vertices = new Point[4];
       rotatedRect.points(vertices);
       List<MatOfPoint> boxContours = new ArrayList<>();
       boxContours.add(new MatOfPoint(vertices));
       Imgproc.drawContours( img, boxContours, 0, new Scalar(128, 128, 128), -1);

       double resultAngle = rotatedRect.angle;
       if (rotatedRect.size.width > rotatedRect.size.height)
       {
           rotatedRect.angle += 90.f;
       }

       Mat result = deskew( img, rotatedRect.angle );
       
   }

錯誤:

2020-10-09 17:41:33.090 12013-12013/com.example.firstapp E/cv::error(): OpenCV(3.4.4) Error: Assertion failed (src.type() == CV_8UC1) in void cv::findNonZero(cv::InputArray, cv::OutputArray), file /build/3_4_pack-android/opencv/modules/core/src/count_non_zero.cpp, line 332
2020-10-09 17:41:33.092 12013-12013/com.example.firstapp E/org.opencv.core: core::findNonZero_10() caught cv::Exception: OpenCV(3.4.4) /build/3_4_pack-android/opencv/modules/core/src/count_non_zero.cpp:332: error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'void cv::findNonZero(cv::InputArray, cv::OutputArray)'
2020-10-09 17:41:33.094 12013-12013/com.example.firstapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.firstapp, PID: 12013
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=203, result=-1, data=Intent { (has extras) }} to activity {com.example.firstapp/com.example.firstapp.Haupt}: CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.4) /build/3_4_pack-android/opencv/modules/core/src/count_non_zero.cpp:332: error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'void cv::findNonZero(cv::InputArray, cv::OutputArray)'
    ]
        at android.app.ActivityThread.deliverResults(ActivityThread.java:5587)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:5628)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
        at android.os.Handler.dispatchMessage(Handler.java:110)
        at android.os.Looper.loop(Looper.java:219)
        at android.app.ActivityThread.main(ActivityThread.java:8347)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
     Caused by: CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.4) /build/3_4_pack-android/opencv/modules/core/src/count_non_zero.cpp:332: error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'void cv::findNonZero(cv::InputArray, cv::OutputArray)'
    ]
        at org.opencv.core.Core.findNonZero_0(Native Method)
        at org.opencv.core.Core.findNonZero(Core.java:1645)
        at com.example.firstapp.Haupt.computeSkew(Haupt.java:652)
        at com.example.firstapp.Haupt.onActivityResult(Haupt.java:469)
        at android.app.Activity.dispatchActivityResult(Activity.java:8412)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:5580)
            ... 11 more

問題在於您的Core.findNonZero調用。 您正在為其提供不兼容的輸入Mat 輸入預計為單通道 8 位圖像。 從您的代碼來看,您似乎正在為去歪斜功能以及最終的Core.findNonZero調用提供彩色圖像。 嘗試在閾值處理之前先將圖像轉換為灰度:

// New code
Imgproc.cvtColor(img, img, Imgproc.COLOR_BGR2GRAY);

// Your code
Imgproc.threshold(img, img, 200, 255, THRESH_BINARY);
// ...
// ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM