Java – OpenCV Android crashes on Imgproc.cvtColor().

OpenCV Android crashes on Imgproc.cvtColor()…. here is a solution to the problem.

OpenCV Android crashes on Imgproc.cvtColor().

I have questions about OpenCV4Android.

java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example.camtime/com.fognature.develop.smp.CameraActivity}:
CvException [org.opencv.core.CvException: cv::Exception:
/hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/imgproc/src/color.cpp:3739:
error: (-215) scn == 3 || scn == 4 in function void
cv::cvtColor(cv::InputArray, cv::OutputArray, int, int)
]
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2320)
at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2380)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1285)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5289)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: CvException [org.opencv.core.CvException: cv::Exception:
/hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/imgproc/src/color.cpp:3739:
error: (-215) scn == 3 || scn == 4 in function void
cv::cvtColor(cv::InputArray, cv::OutputArray, int, int)
]
at org.opencv.imgproc.Imgproc.cvtColor_1(Native Method)
at org.opencv.imgproc.Imgproc.cvtColor(Imgproc.java:4598)
at
com.fognature.develop.smp.CameraActivity.onCreate(CameraActivity.java:108)
at android.app.Activity.performCreate(Activity.java:6018)
at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2273)
… 10 more

In this code section:

Mat sec;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

sec = new Mat();
        setContentView(R.layout.activity_camera);
    File photo = new File(Environment.getExternalStorageState()

+File.separator+"SMP"+File.separator+getIntent().getStringExtra("c_name")+File.separator+getIntent().getStringExtra("last_photo"));
                sec = Highgui.imread(photo.getAbsolutePath());
                Imgproc.cvtColor(sec, sec, Imgproc.COLOR_RGBA2GRAY);
        }

It is always in Imgproc.cvtColor(sec, sec, Imgproc.COLOR_RGBA2GRAY);

on crashing

Solution

The error states:

error: (-215) scn == 3 || scn == 4 in function void
cv::cvtColor(cv::InputArray, cv::OutputArray, int, int) ]

This usually means:

  • When you try to convert RGBA2GRAY, the input Mat sec in this case has only 1 channel. You can confirm this by recording sec.channels() immediately after reading it.
  • It is also possible that the input Mat is empty or corrupted, and you can check sec.width, sec.height, sec.depth< to confirm properties such as to ensure that it is loaded correctly.

Related Problems and Solutions