[android]opencv中的流域示例

[android]opencv中的流域示例,android,image,opencv,image-processing,Android,Image,Opencv,Image Processing,当前正在尝试 <code> public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); Imgproc.Canny(mRgba, markers, 80, 90); Mat threeChannel = new Mat(); Imgproc.cvtColor(mRgba, threeChannel, Imgproc

当前正在尝试

<code>
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        mRgba = inputFrame.rgba();
        Imgproc.Canny(mRgba, markers, 80, 90);
        Mat threeChannel = new Mat();
        Imgproc.cvtColor(mRgba, threeChannel, Imgproc.COLOR_BGR2GRAY);
        Imgproc.watershed(threeChannel, markers);
        return threeChannel;
}

</code>
然而,它失败了

CvException [org.opencv.core.CvException: /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/segmentation.cpp:147: error: (-210) Only 8-bit, 3-channel input images are supported in function void cvWatershed(const CvArr*, CvArr*)

您能否建议如何适当使用Canny/Sobel边缘检测中的标记来为分水岭算法提供信息?Android细节将非常有帮助,因为这是我的第一个Android项目。

错误说明
waterrence()
的输入图像必须是8位3通道图像。调用
cvtColor()
后,打印
threeChannel
的通道数。如果它输出1,不要感到惊讶


mRgba
直接传递到
waterwater()
并查看发生了什么。我以前的一个答案是,你可以用它进行测试。

你只需要将图像从4个通道转换为3个通道。 比如说

Imgproc.cvtColor(mat , mat, Imgproc.COLOR_BGRA2BGR);

干杯,原始图像mRgba有4个通道,所以我使用了
COLOR\u BGRA2BGR
而不是
COLOR\u bgr2 gray
。现在的问题是Canny返回
CV_8UC1
作为标记输出,而
Waterline
需要32位单通道图像。我使用了
mIntermediateMat.convertTo(mIntermediateMat,CvType.cv32s)但分水岭的结果是纯白色图像。对哪里出了问题有什么建议吗?也许从8位无符号到32位有符号的转换会让它一次解决一个问题。请随意在另一个线程中提出另一个问题。如果我的答案对你有帮助,别忘了投我的票,或者点击旁边的复选框,选择它作为正式的问题解决者。我很想在一个新问题中看到你的新代码。无法真正发布另一个问题,因为它仍然是相同的。不,你的问题完全改变了。你们来到这里是为了发现为什么会发生这个特定的错误,以及如何修复它,我相信这已经解决了。您可能正在使用相同的源代码,但现在您提出了一个不同的问题。要在这个线程中提出这个新问题,您必须完全重写这个问题并更新源代码,这将是一个耻辱,因为我们需要有关这个问题以及如何解决它的信息。更不用说,我必须完全重写我的答案来解决这个新问题。@karlphillip我已经尝试开发一个kotlin应用程序好几个星期了,它将针对伤口图像中的一个感兴趣区域。我需要用户使用设备屏幕的触摸来绘制感兴趣区域的周围环境,以便分水岭只能分割该区域并将背景颜色更改为黑色。我真的需要这样做,我不能从任何人那里得到帮助,请你帮我。你解决了显示纯白色图像的问题了吗?我现在面临着类似的问题,找不到任何解决办法。