2016-10-24 41 views
0

Core.inRange関数を使用するとアサーションエラーが発生します。関数。私は、同様の質問からの回答のすべての解決策に従ってきました。他の解決策は、チャネルの数をチェックし、画像が空であることを確認し、インストールを検証することであった。私はMacでAndroid Studio 2.2を使用しています。テストされた携帯電話はZTE Speed KitKatとMoto g3 Marshmallowでした。OpenCVエラー:Core.inRangeを呼び出すと、アサーションが失敗しました(scn == 3 || scn == 4)

私の目標は、画像から赤と青を取得することです>赤いライトが点灯しているか青色が点灯しているかを判断することです。コードはVuforiaフレームから画像を取得し、ビットマップに変換して、OpenCVを使用して画像を操作しようとします。これは、Vuforiaをコアの一部として実装する前に、以前のコードで作業していました。

これは、これらのコマンドは

を実行したときに私が得る2つのエラーで、Imgproc.cvtColor機能が正常に動作し、その非常に最後の1 Core.inRange

 Mat mat1 = new Mat(640,480, CvType.CV_8UC4); 
     Mat mat2 = new Mat(640,480, CvType.CV_8UC4); 
     Mat mat3 = new Mat(640,480, CvType.CV_8UC4); 

     ....... 

     Log.d("OPENCV","Height " + rgb.getHeight() + " Width " + rgb.getWidth()); 

     Bitmap bm = Bitmap.createBitmap(rgb.getWidth(), rgb.getHeight(), Bitmap.Config.RGB_565); 
     bm.copyPixelsFromBuffer(rgb.getPixels()); 
     //Mat tmp = OCVUtils.bitmapToMat(bm, CvType.CV_8UC4); 
     Mat tmp = new Mat(rgb.getWidth(), rgb.getHeight(), CvType.CV_8UC4); 
     Utils.bitmapToMat(bm, tmp); 

     SaveImage(tmp, "-raw"); 
     fileLogger.writeEvent("process()","Saved original file "); 
     Log.d("OPENCV","CV_8UC4 Height " + tmp.height() + " Width " + tmp.width()); 
     Log.d("OPENCV","Channels " + tmp.channels()); 

     tmp.convertTo(mat1, CvType.CV_8UC4); 
     Size size = new Size(640,480);//the dst image size,e.g.100x100 

     resize(mat1,mat1,size);//resize image 
     SaveImage(mat1, "-convertcv_8uc4"); 
     Log.d("OPENCV","CV_8UC4 Height " + mat1.height() + " Width " + mat1.width()); 
     fileLogger.writeEvent("process()","converted to cv_8uc4"); 
     Log.d("OPENCV","Channels " + mat1.channels()); 

     Imgproc.cvtColor(mat1, mat2, Imgproc.COLOR_RGB2HSV_FULL); 
     SaveImage(mat2, "-COLOR_RGB2HSV_FULL"); 
     Log.d("OPENCV","COLOR_RGB2HSV Height " + mat2.height() + " Width " + mat2.width()); 
     Log.d("OPENCV","Channels " + mat2.channels()); 

     //Core.inRange(mat2, RED_LOWER_BOUNDS_HSV, RED_UPPER_BOUNDS_HSV, mat3); 
     Log.d("OPENCV","mat2 Channels " + mat2.channels() + " empty " + mat2.empty()); 
     Log.d("OPENCV","mat3 Channels " + mat3.channels() + " empty " + mat3.empty()); 
     Core.inRange(mat2, new Scalar(0,100,150), new Scalar(22,255,255), mat3); 
        fileLogger.writeEvent("process()","Set Red window Limits: "); 
     SaveImage(mat3, "-red limits"); 

コードの主要な部分であります

 E/cv::error(): OpenCV Error: Assertion failed (scn == 3 || scn == 4) in void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int), file /home/maksim/workspace/android-pack/opencv/modules/imgproc/src/color.cpp, line 7349 
     E/org.opencv.imgproc: imgproc::cvtColor_10() caught cv::Exception: /home/maksim/workspace/android-pack/opencv/modules/imgproc/src/color.cpp:7349: error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int) 

3枚の画像が画像ディレクトリに期待通りに保存されます。

私のログは、私は2台の異なる携帯電話を試してみました

D/OPENCV: mat2 Channels 3 empty false 
D/OPENCV: mat3 Channels 4 empty false 

以下、ダウン解像度を調整しようとした生産します。 OpenCVモジュールが正しくインストールされていない場合に備えて、OpenCVモジュールを再インストールしました。私はすべての3チャンネル、すべての4チャンネルの画像を作りました。

答えて

0

デバッグの1週間後、それは間違いの中で最も愚かでした! SaveImage関数内 Imgproc.cvtColor(mat、mIntermediateMat、Imgproc.COLOR_RGBA2BGR、3); これが問題の原因となっていました。 Core.inRangeがSaveImage関数の後。 Core.inRangeはチャンネルを1に落としました - fileLoggerは最後のログをフラッシュしませんでした。もし私がLogを代わりに使用していたら、おそらくもっと早くそれを選んだでしょう。

public void SaveImage (Mat mat, String info) { 
    Mat mIntermediateMat = new Mat(); 

    Imgproc.cvtColor(mat, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3); <--Here bad 

    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    String filename = "ian" + info + ".png"; 
    File file = new File(path, filename); 

    Boolean bool = null; 
    filename = file.toString(); 
    bool = Imgcodecs.imwrite(filename, mIntermediateMat); 

    if (bool == true) 
     Log.d("filesave", "SUCCESS writing image to external storage"); 
    else 
     Log.d("filesave", "Fail writing image to external storage"); 
} 
関連する問題