opencvjava中的灰度反转图像

opencvjava中的灰度反转图像,java,android,opencv,image-processing,Java,Android,Opencv,Image Processing,我想将openCV中的反转图像转换为灰度,我使用了来反转BGR图像,但是我得到了一个关于Imgproc.cvtColor方法的错误 这是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/rep

我想将openCV中的反转图像转换为灰度,我使用了来反转BGR图像,但是我得到了一个关于Imgproc.cvtColor方法的错误

这是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
我的代码有错误吗?
非常感谢

您不需要手动反转图像,有一个阈值标记,可以自动执行此操作:

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);



但是您的错误消息抱怨说,cvtColor的输入既没有3个通道,也没有4个通道,因此它要么是灰度,要么是完全空的/无效的img。

您不需要手动反转图像,有一个阈值标记,它会自动:

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);



但是您的错误消息抱怨说,cvtColor的输入既没有3个通道,也没有4个通道,因此它要么是灰度,要么是完全空的/无效的img。

您不需要手动反转图像,有一个阈值标记,它会自动:

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);



但是您的错误消息抱怨说,cvtColor的输入既没有3个通道,也没有4个通道,因此它要么是灰度,要么是完全空的/无效的img。

您不需要手动反转图像,有一个阈值标记,它会自动:

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);




但是您的错误消息抱怨说,cvtColor的输入既没有3个通道,也没有4个通道,因此它要么是灰度,要么是完全空的/无效的img。

您是否尝试过先转换为灰度,然后再反转?就我所知,没有理由减去三个通道,然后转换。您的
bgrFrame
是否可能是
BGRA
?这是android上的标准类型。请尝试
Imgproc.COLOR\u BGRA2GRAY
,或者调整你的
Scalar(255255255)
@Mailerdaimon我的目标是检测瞳孔边界,如中所示,教程中说我必须首先反转图像,而不是首先进行灰度缩放。如果我先对其进行灰度缩放,然后进行反转,结果是否可能与该教程中的结果相同?如果我错了,我很抱歉,我刚刚在OpenCV上开始了我的第一个项目,我只是在遵循那个教程。谢谢你的帮助。@Mika我试过Imgproc.COLOR\u BGRA2GRAY,但还是不走运。谢谢你的帮助。你能打印
invertdmat.type()
invertdmat.channels()
吗?异常告诉你,在我看来,你的源Mat的通道数有问题……你是否尝试过先转换为灰度然后再反转?就我所知,没有理由减去三个通道,然后转换。您的
bgrFrame
是否可能是
BGRA
?这是android上的标准类型。请尝试
Imgproc.COLOR\u BGRA2GRAY
,或者调整你的
Scalar(255255255)
@Mailerdaimon我的目标是检测瞳孔边界,如中所示,教程中说我必须首先反转图像,而不是首先进行灰度缩放。如果我先对其进行灰度缩放,然后进行反转,结果是否可能与该教程中的结果相同?如果我错了,我很抱歉,我刚刚在OpenCV上开始了我的第一个项目,我只是在遵循那个教程。谢谢你的帮助。@Mika我试过Imgproc.COLOR\u BGRA2GRAY,但还是不走运。谢谢你的帮助。你能打印
invertdmat.type()
invertdmat.channels()
吗?异常告诉你,在我看来,你的源Mat的通道数有问题……你是否尝试过先转换为灰度然后再反转?就我所知,没有理由减去三个通道,然后转换。您的
bgrFrame
是否可能是
BGRA
?这是android上的标准类型。请尝试
Imgproc.COLOR\u BGRA2GRAY
,或者调整你的
Scalar(255255255)
@Mailerdaimon我的目标是检测瞳孔边界,如中所示,教程中说我必须首先反转图像,而不是首先进行灰度缩放。如果我先对其进行灰度缩放,然后进行反转,结果是否可能与该教程中的结果相同?如果我错了,我很抱歉,我刚刚在OpenCV上开始了我的第一个项目,我只是在遵循那个教程。谢谢你的帮助。@Mika我试过Imgproc.COLOR\u BGRA2GRAY,但还是不走运。谢谢你的帮助。你能打印
invertdmat.type()
invertdmat.channels()
吗?异常告诉你,在我看来,你的源Mat的通道数有问题……你是否尝试过先转换为灰度然后再反转?就我所知,没有理由减去三个通道,然后转换。您的
bgrFrame
是否可能是
BGRA
?这是android上的标准类型。请尝试
Imgproc.COLOR\u BGRA2GRAY
,或者调整你的
Scalar(255255255)
@Mailerdaimon我的目标是检测瞳孔边界,如中所示,教程中说我必须首先反转图像,而不是首先进行灰度缩放。如果我先对其进行灰度缩放,然后进行反转,结果是否可能与该教程中的结果相同?如果我错了,我很抱歉,我刚刚在OpenCV上开始了我的第一个项目,我只是在遵循那个教程。谢谢你的帮助。@Mika我试过Imgproc.COLOR\u BGRA2GRAY,但还是不走运。谢谢你的帮助。你能打印
invertdmat.type()
invertdmat.channels()
吗?异常告诉您,就我所见,源Mat的通道数有问题。。。