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 之后的操作顺序应该是:
- 复制您的 edgesMat 并将其转换为 BGRA。 (称之为 colorEdges)
- 使用 edgesMat 将 colorEdges 中的白色替换为您选择的颜色(您希望在视频源上绘制的颜色)一个面具。
- 然后使用 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)
我对 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 之后的操作顺序应该是:
- 复制您的 edgesMat 并将其转换为 BGRA。 (称之为 colorEdges)
- 使用 edgesMat 将 colorEdges 中的白色替换为您选择的颜色(您希望在视频源上绘制的颜色)一个面具。
- 然后使用 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)