java - OpenCV:从 Canny 画线

标签 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 .

最佳答案

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

在我看来,您在运行 Canny 后的操作顺序应该是这样的:

  1. 复制您的 edgesMat 并将其转换为 BGRA。 (称之为colorEdges)
  2. 使用 edgesMat 作为 mask ,将 colorEdges 中的白色替换为您选择的颜色(您希望在视频源上绘制的颜色)。
  3. 然后使用 edgesMat 作为 mask ,将 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)

关于java - OpenCV:从 Canny 画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28509709/

相关文章:

OpenCV:以毫米为单位测量两个球之间的距离——如何提高精度

python - 如何从图像中提取椭圆轮廓并保存到不同的变量中?

c++ - OpenCV VideoCapture 有时会返回空白帧

java - 如何创建自定义按钮形状类

java - 如何知道用户何时关闭 Java 中使用 exec() 执行的程序

java - 如何从URL获取数据并将其转换为json?

android - 支持多设备(屏幕)的 UI 实现方式有多少

android - 如何使用 Google Play Services Vision API Xamarin Android 打开手电筒/手电筒

java - 无法在文件中找到换行符(java)

android - 在 FragmentPagerAdapter 下的 SherlockFragment 上未调用 onCreateOptionsMenu