OpenCV:从Canny绘制线条

时间:2015-02-13 22:18:33

标签: java android opencv

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

我只是试图让一些基本的东西运行起来 - 我想直接在进入的图像上绘制Canny算法检测到的边缘。我目前有这个:

Canny Screenshot

我正在直接显示Canny的边缘数据,但现在我想摆脱黑色,只是在正在处理的图像上显示白色。

我尝试使用谷歌搜索“使用二进制图像作为alpha蒙版”,但经过一天阅读教程并尝试了我能找到的所有内容后,我仍然不确定我知道发生了什么。 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上发布了这个问题。

1 个答案:

答案 0 :(得分:1)

我已经十多年没有使用过Java了,并且根本没有使用Java和OpenCV,但我会试着说明如何做到这一点。我正在尽我所能用这种语言写作,但如果我不能正确地做到这一点,我希望你能够做出那些微小的改动,让它发挥作用。

我认为运行Canny之后你的操作顺序应该是:

  1. 复制 edgesMat 并将其转换为BGRA。 (称之为 colorEdges
  2. 使用 edgesMat 作为蒙版,将 colorEdges 中的白色替换为您选择的颜色(您希望在视频Feed上绘制的颜色)。
  3. 然后使用 edgesMat 作为掩码,将 colorEdges 放回 rgbaInnerWindow
  4. 代码:

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