对于OpenCV,我是一个完全新手,所以这可能是一个愚蠢的问题。
我只是试图让一些基本的东西运行起来 - 我想直接在进入的图像上绘制Canny算法检测到的边缘。我目前有这个:
我正在直接显示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上发布了这个问题。
答案 0 :(得分:1)
我已经十多年没有使用过Java了,并且根本没有使用Java和OpenCV,但我会试着说明如何做到这一点。我正在尽我所能用这种语言写作,但如果我不能正确地做到这一点,我希望你能够做出那些微小的改动,让它发挥作用。
我认为运行Canny之后你的操作顺序应该是:
代码:
//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)