Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javacv识别长度和宽度可变的正方形或矩形?_Java_Image Processing_Opencv_Javacv - Fatal编程技术网

如何使用javacv识别长度和宽度可变的正方形或矩形?

如何使用javacv识别长度和宽度可变的正方形或矩形?,java,image-processing,opencv,javacv,Java,Image Processing,Opencv,Javacv,我正在用java开发一个项目,用opencv软件包来识别组件,但我对javacv不太熟悉,我只想知道如何识别特定源图像中的矩形。请有经验的人给我一些基本的指导来归档这个任务。我尝试在这里使用模板匹配,但它只能识别矩形的确切大小。但在我的例子中,我需要识别可变长度的矩形 import java.util.Arrays; import static com.googlecode.javacv.cpp.opencv_core.*; import static com.googlecode.javacv

我正在用java开发一个项目,用opencv软件包来识别组件,但我对javacv不太熟悉,我只想知道如何识别特定源图像中的矩形。请有经验的人给我一些基本的指导来归档这个任务。我尝试在这里使用模板匹配,但它只能识别矩形的确切大小。但在我的例子中,我需要识别可变长度的矩形

import java.util.Arrays;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class TestingTemplate {
public static void main(String[] args) {
//Original Image
IplImage src = cvLoadImage("src\\lena.jpg",0);
//Template Image
IplImage tmp = cvLoadImage("src\\those_eyes.jpg",0);
//The Correlation Image Result
IplImage result = cvCreateImage(cvSize(src.width()-tmp.width()+1, src.height()-tmp.height()+1), IPL_DEPTH_32F, 1);
//Init our new Image
cvZero(result);
cvMatchTemplate(src, tmp, result, CV_TM_CCORR_NORMED);

double[] min_val = new double[2];
double[] max_val = new double[2];

//Where are located our max and min correlation points
CvPoint minLoc = new CvPoint();
CvPoint maxLoc = new CvPoint();
cvMinMaxLoc(result, min_val, max_val, minLoc, maxLoc, null); //the las null it's for
 optional mask mat()

System.out.println(Arrays.toString(min_val)); //Min Score
System.out.println(Arrays.toString(max_val)); //Max Score

CvPoint point = new CvPoint();
point.x(maxLoc.x()+tmp.width());
point.y(maxLoc.y()+tmp.height());
cvRectangle(src, maxLoc, point, CvScalar.WHITE, 2, 8, 0); //Draw the rectangule result in original img.
cvShowImage("Lena Image", src);
cvWaitKey(0);
//Release
cvReleaseImage(src);
cvReleaseImage(tmp);
cvReleaseImage(result);
}
}
请找个人帮忙完成这项工作(因此它被固定为正方形)

对于方形检测,OpenCV附带了一些示例。代码在C++、C、Python中。希望您可以将其移植到JavaCV

我只想说明它是如何工作的:

1-首先将图像拆分为R、G、B平面

2-然后对每个平面执行边缘检测,除此之外,对不同的值(如50、100等)执行阈值。。。。等等

3-在所有这些二值图像中,查找轮廓(请记住,它正在处理大量图像,因此可能有点慢,如果您不想,可以删除一些阈值)

4-找到轮廓后,根据区域进行滤波,去除一些不必要的小噪声

5-然后,近似轮廓。().

6-对于矩形,它将为您提供四个角。对于其他,将给出相应的角

所以,根据近似轮廓中的元素数量过滤这些轮廓,这些元素的数量应该是四个,这与角的数量相同矩形的第一个属性。

7-接下来,可能会有一些四角形状,但不是矩形。所以我们取矩形的第二个性质,即所有内角都是90。因此,我们使用以下关系式求出所有角的角度:

如果cos(θ)<0.1,即θ>84度,则为矩形

那么广场呢使用其属性,即所有边都相等。

您可以通过如上所示的关系找到两点之间的距离。检查它们是否都相等,则该矩形为正方形

这就是代码的工作原理

下面是我在图像上应用上述代码得到的输出:

编辑:

有人询问如何删除在边框处检测到的矩形。这是因为,opencv在黑色背景中找到白色对象,所以边框也是。只需使用cv2.bitwise_not()函数反转图像即可解决此问题。我们得到的结果如下:


你可以在这里找到更多关于contour的信息:

Dave:请你提供一些公会路线来存档这个>是squire还是SQUARE?如果不是,什么是乡绅?谷歌称这是士兵的盔甲。这就是你想要的吗?最好添加一个图像。哦,我只是看到了那个错误,我真的需要在图像上识别矩形和正方形。对于我所犯的错误,我真的很抱歉。现在我已经纠正了这个问题。你能解释一下我如何得到小于特定宽度的矩形吗?实际上,我需要删除显示在图像中的大矩形(边框)。检测到大矩形边框是因为opencv轮廓在黑色背景中找到白色对象。因此,将正方形变成白色(只需反转图像)。我已经更新了答案。所以我不能分别得到每个矩形和每个矩形吗?如果可以的话,你能提供一些代码示例吗?你能解释一下如何使用上面的代码识别SQURE吗?因为它也给出了所有的矩形,你能解释一下吗?嗨,我在回答中已经解释过了。第八点。找出所有点之间的距离,并检查它们是否几乎相等。