安卓OpenCV中的分水岭示例

3

目前正尝试中

<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边缘检测的标记来输入Watershed算法?由于这是我的第一个Android项目,因此Android特定信息将非常有用。


你已经解决了显示纯白图像的问题吗?我现在也面临着类似的问题,找不到任何解决方案。 - John Yang
2个回答

4
错误提示表明 watershed() 的输入图像必须是一个8位三通道图像。调用 cvtColor() 后,打印 threeChannel 的通道数。如果输出1,不要感到惊讶。
直接将mRgba传递给watershed(),看看会发生什么。我的先前回答中有使用 watershed 的可行代码,您可以使用该代码进行测试。

原始图像mRgba有4个通道,因此我使用了COLOR_BGRA2BGR而不是COLOR_BGR2GRAY。现在的问题是Canny返回CV_8UC1作为标记器输出,而watershed期望32位单通道图像。我使用了mIntermediateMat.convertTo(mIntermediateMat,CvType.CV_32S);但是watershed的结果是一个纯白色图像。有什么建议出了什么问题吗?也许从8位无符号到32位有符号的转换弄错了。 - nmadzharov
让我们逐个解决问题。如果您有其他问题,请在另一个线程中提问。如果我的回答有帮助到您,请随意点赞,或者在其旁边的复选框上单击以选择它为官方问题解决者。我很想在新问题中看到您的新代码。 - karlphillip
由于问题仍然相同,不能真正发布另一个问题。 - nmadzharov
根本不是这样,你的问题完全变了。你来这里是为了发现为什么会出现这个特定的错误,以及如何修复它,我相信这个问题已经得到解决。你可能正在处理同一个源代码,但现在你正在问一个不同的问题。要在这个主题中问这个新问题,你必须完全重写问题并更新源代码,这将是一件遗憾的事,因为我们已经有关于这个问题及其解决方法的信息了。更不用说我还得完全重写我的答案来解决新问题。 - karlphillip
@karlphillip 我已经尝试了几周开发一个Kotlin应用程序,以便在伤口图像中定位感兴趣的区域。我需要用户使用设备屏幕的触摸来绘制该区域的周围环境,以便分水岭算法只能分割该区域并将背景颜色更改为黑色。我真的需要完成这个任务,但是我无法得到任何人的帮助。如果您能帮我解决这个问题,我将不胜感激。 - Tecnologia da Net

1
你只需要将图像从4通道转换为3通道即可。 例如:
Imgproc.cvtColor(mat , mat, Imgproc.COLOR_BGRA2BGR);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接