0
我正在研究一个程序,该程序可以提取拼图上的贴纸,然后再找到它们的RGB。目前,我正处于想要删除任何非“方形”的轮廓。我想知道我该如何做到这一点。查找并消除轮廓opencv
我所做的是我加载图像,灰色它,模糊它,canny边缘检测,扩大它找到轮廓,并绘制它们。
有没有办法绕着轮廓绘制而不是填充它们?并删除轮廓不是大致相同的大小或几乎90度的角度?
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat capturedFrame = Imgcodecs.imread("first.png");
//Gray
Mat gray = new Mat();
Imgproc.cvtColor(capturedFrame, gray, Imgproc.COLOR_BGR2GRAY);
//Blur
Mat blur = new Mat();
Imgproc.blur(gray, blur, new Size(3,3));
//Canny image
Mat canny = new Mat();
Imgproc.Canny(blur, canny, 20, 40, 3, true);
Imgcodecs.imwrite("test.png", canny);
//System.exit(0);
Mat kernel = Imgproc.getStructuringElement(1, new Size(3,3));
Mat dilated = new Mat();
Imgproc.dilate(canny,dilated, kernel);
List<MatOfPoint> contours = new ArrayList<>();
//find contours
Imgproc.findContours(dilated, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_NONE);
//draw contours
Imgproc.cvtColor(capturedFrame, capturedFrame, Imgproc.COLOR_BGR2RGB);
for(int i = 0; i < contours.size(); i++){
Imgproc.drawContours(capturedFrame, contours, i, new Scalar(0, 0, 255), -1);
}
Imgcodecs.imwrite("after.png", capturedFrame);
Imshow img = new Imshow("firstImg");
img.show(capturedFrame);
}
这里是初始图像:
这里是与轮廓线的图像得出:
谢谢我现在正在绘制轮廓:)。有没有办法让它更具“灵活性”,比如看它是否具有某种方形的形状,例如两侧的长度相同,或者轮廓几乎有90度?我问的原因是因为图像并不总是这一个,因为它是一个被捕捉的框架,立方体可以被捕捉得更近或更远。 – ProgrammingCuber
如果轮廓区域接近minAreaRect区域,可以发现minAreaRect,这意味着轮廓接近矩形。您可以通过找到minRect边的比例来控制它是否平方。 –