我试图在JAVA(Android)中绘制图像的轮廓但它似乎没有做任何事情(函数不能绘制任何东西)这里是代码:
public Mat contours(Mat mat)
{
ArrayList<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Mat balele = new Mat();
mat.convertTo(balele, CvType.CV_32SC1);
// find contours:
Imgproc.findContours(balele, contours, hierarchy, Imgproc.RETR_FLOODFILL, Imgproc.CHAIN_APPROX_SIMPLE);
Mat source = new Mat(balele.size(), balele.type());
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++)
{
Imgproc.drawContours(source, contours, contourIdx, new Scalar(0,0,255), -1);
}
return source;
}
当我们将mat图像传递给方法时,mat图像已经是二进制格式。
您是否发现任何错误?
更新: 我更新了代码,它看起来像这样:
公共垫轮廓(垫垫) {
ArrayList<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
// find contours:
Imgproc.findContours(mat, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
System.out.println(contours.size() + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
Mat source = new Mat();
for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++)
{
Imgproc.drawContours(source, contours, contourIdx, new Scalar(0,0,255), -1);
}
return source;
}
我仍然没有得到所有的轮廓,我得到一个浅白色。有任何纠正的想法吗?
答案 0 :(得分:0)
Imgproc.findContours
在内部更改创建工件的输入Mat
,如上所示,您可以将Mat
作为克隆对象传递,以便更改不会反映在输入{{ 1}}。我不确定是否存在更好的解决方案,因为克隆Mat
肯定会有一些时间和空间(不是太多)。所以你可以使用:
Mat
答案 1 :(得分:0)
我发现了问题。这确实是 OpenCV 库中的一个错误。下面的代码正是 OpenCV 在 java 中实现 drawContours() 的方式。它总是使用包含 R、G、B 和 Alpha 的四个值标度。
http {
upstream lbc {
server localhost:5010;
server localhost:5020;
}
server {
listen 8090;
location / {
proxy_pass http://lbc;
}
}
}
现在,让我们考虑一下 alpha 的默认值是多少。零,对吗?这就是为什么你总是用黑色画画。解决方案是使用四个值标量,例如 new Scalar(0, 0, 255, 1)