2015-01-06 136 views
0

我想在openCV中將反轉的圖像轉換爲灰度,我使用this method來反轉BGR圖像,但是我得到了有關Imgproc.cvtColor方法的錯誤。OpenCV Java中的灰度反轉圖像

這是logcat的:

01-06 13:43:01.085: E/cv::error()(8837): OpenCV Error: Assertion failed (scn == 3 || scn == 4) in void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int), file /home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/color.cpp, line 3737 
01-06 13:43:01.095: E/org.opencv.imgproc(8837): imgproc::cvtColor_11() caught cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/color.cpp:3737: error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int) 
01-06 13:43:01.095: E/AndroidRuntime(8837): FATAL EXCEPTION: main 
01-06 13:43:01.095: E/AndroidRuntime(8837): Process: com.example.irisrecog, PID: 8837 
01-06 13:43:01.095: E/AndroidRuntime(8837): java.lang.RuntimeException: Unable to resume activity {com.example.irisrecog/com.example.irisrecog.MainActivity}: CvException [org.opencv.core.CvException: cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/color.cpp:3737: error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int) 
01-06 13:43:01.095: E/AndroidRuntime(8837): ] 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2850) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2879) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1288) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.os.Handler.dispatchMessage(Handler.java:102) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.os.Looper.loop(Looper.java:212) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.app.ActivityThread.main(ActivityThread.java:5151) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at java.lang.reflect.Method.invoke(Method.java:515) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at dalvik.system.NativeStart.main(Native Method) 
01-06 13:43:01.095: E/AndroidRuntime(8837): Caused by: CvException [org.opencv.core.CvException: cv::Exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/color.cpp:3737: error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int) 
01-06 13:43:01.095: E/AndroidRuntime(8837): ] 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at org.opencv.imgproc.Imgproc.cvtColor_1(Native Method) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at org.opencv.imgproc.Imgproc.cvtColor(Imgproc.java:4598) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at com.example.irisrecog.MainActivity.segmentasi(MainActivity.java:240) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at com.example.irisrecog.MainActivity.deteksiIrisMata(MainActivity.java:283) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at com.example.irisrecog.MainActivity.onResume(MainActivity.java:135) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1192) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.app.Activity.performResume(Activity.java:5310) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2840) 
01-06 13:43:01.095: E/AndroidRuntime(8837):  ... 10 more 

以下是我對灰度化倒像代碼:

//invert matrix - bgrFrame 
Mat invertedMat = new Mat(bgrFrame.rows(), bgrFrame.cols(), bgrFrame.type()); 
Mat invertColorMat = new Mat(bgrFrame.rows(), bgrFrame.cols(), bgrFrame.type(), new Scalar(255,255,255)); 
Core.subtract(invertColorMat, bgrFrame, invertedMat); 
//grayscaling inverted matrix 
Mat grayscaledMat = new Mat(); 
Imgproc.cvtColor(invertedMat, grayscaledMat, Imgproc.COLOR_BGR2GRAY); // this line caused an error 

有沒有在我的代碼的任何錯誤? 非常感謝您

+0

你有沒有嘗試先轉換爲灰度,然後反轉?沒有理由減去三個渠道,然後轉換,據我所知。 – Mailerdaimon

+0

是否有可能你的'bgrFrame'是'BGRA'而不是? afaik是Android上的標準類型。請嘗試'Imgproc.COLOR_BGRA2GRAY'來代替調整你的'標量(255,255,255)' – Micka

+0

@Mailerdaimon我的目標是檢測瞳孔邊界,就像[本教程]一樣(https://opencv-code.com/tutorials/pupil-detection-這個教程說我必須首先反轉圖像,而不是先灰度化。如果我先進行灰度化然後反轉,那麼結果是否與該教程中的結果相同?如果我錯了,我很抱歉,我剛剛開始了我的第一個OpenCV項目,我只是按照該教程。謝謝您的幫助。 –

回答

3

你不需要手動翻轉圖像,有對於閾值的標誌,這是自動執行:

Mat grayscaledMat = new Mat(); 
Imgproc.cvtColor(bgrFrame, grayscaledMat, Imgproc.COLOR_BGR2GRAY); 

Mat thresh = new Mat(); 
Imgproc.threshold(grayscaledMat, thresh, 30, 255, Imgproc.THRESH_BINARY_INV); 

enter image description here


,但你的錯誤-msg抱怨說,cvtColor的輸入既沒有3通道,也沒有4通道,所以它不是灰度級就是空的/無效的img。