OpenCV:从 Canny 画线

OpenCV: Draw Lines from Canny

我对 OpenCV 完全是个新手,所以这可能是个愚蠢的问题。

我只是想做一些基本的事情 运行- 我想直接在传入的图像上绘制 Canny 算法检测到的边缘。我目前有这个:

我直接显示来自 Canny 的边缘数据,但现在我想在正在处理的图像上去掉黑色,只显示白色。

我已经尝试使用谷歌搜索 "using binary image as alpha mask" 之类的东西,但是在阅读了一天的教程并尝试了我能找到的所有内容之后,我仍然不确定我知道发生了什么。 OpenCV 似乎非常强大,所以这可能是一件很容易做到的事情,所以我希望有人能给我指出正确的方向。

这是我正在使用的代码,其中大部分是从示例中复制的:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    Mat rgba = inputFrame.rgba();
    org.opencv.core.Size sizeRgba = rgba.size();

    Mat rgbaInnerWindow;


    int rows = (int) sizeRgba.height;
    int cols = (int) sizeRgba.width;

    int left = cols / 8;
    int top = rows / 8;

    int width = cols * 3 / 4;
    int height = rows * 3 / 4;

    //get sub-image
    rgbaInnerWindow = rgba.submat(top, top + height, left, left + width);

    //create edgesMat from sub-image
    Imgproc.Canny(rgbaInnerWindow, edgesMat, 100, 100);

    //copy the edgesMat back into the sub-image
   Imgproc.cvtColor(edgesMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4);

    rgbaInnerWindow.release();

    return rgba;
}

编辑:我还在 OpenCV 论坛上发布了这个问题 here

我已经有十多年没有使用过 Java 了,也根本没有在 OpenCV 中使用过 Java,但我将尝试阐述我将如何做到这一点.我正在尽最大努力用这种语言编写它,但如果我不太正确,我希望你能够进行这些小的更改以使其正常工作。

据我所知,您在 运行 Canny 之后的操作顺序应该是:

  1. 复制您的 edgesMat 并将其转换为 BGRA。 (称之为 colorEdges
  2. 使用 edgesMatcolorEdges 中的白色替换为您选择的颜色(您希望在视频源上绘制的颜色)一个面具。
  3. 然后使用 edgesMat 作为遮罩,将 colorEdges 放回 rgbaInnerWindow 上。

代码:

//step 1
Mat colorEdges;
edgesMat.copyTo(colorEdges);
Imgproc.cvtColor(colorEdges, colorEdges, COLOR_GRAY2BGRA);
//step 2
newColor = new Scalar(0,255,0);    //this will be green
colorEdges.setTo(newColor, edgesMat);
//step 3
colorEdges.copyTo(rgbaInnerWindow, edgesMat);    //this replaces your current cvtColor line, placing your Canny edge lines on the original image

应该可以的。 :)

copyTo (Mat m)
cvtColor (Mat src, Mat dst, int code)
setTo (Mat value, Mat mask)
copyTo (Mat m, Mat mask)