[英]How to get x,y coordinates of extracted objects in javacv?
目前我正在开发图像处理项目,我正在使用javacv开发图像处理组件。 我能够提取图像的一些有趣部分,现在我需要读取这些对象的x和y坐标。 这是我提取的图像
我需要识别这些对象并围绕这些对象绘制正方形。 我浏览了一些教程并尝试使用以下代码识别对象。
IplImage img="sourceimage";
CvSize sz = cvSize(img.width(), img.height());
IplImage gry=cvCreateImage(sz, img.depth(), 1);
cvCvtColor(img, gry, CV_BGR2GRAY);
cvThreshold(gry, gry, 200, 250, CV_THRESH_BINARY);
CvMemStorage mem = CvMemStorage.create();
CvSeq contours = new CvSeq();
CvSeq ptr = new CvSeq();
cvFindContours(gry, mem, contours, Loader.sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
CvRect boundbox;
for (ptr = contours; ptr != null; ptr = ptr.h_next()) {
boundbox = cvBoundingRect(ptr, 0);
if(boundbox.height()>10||boundbox.height()>10){
cvRectangle( gry, cvPoint( boundbox.x(), boundbox.y() ), cvPoint( boundbox.x() + boundbox.width(), boundbox.y() + boundbox.height()),CvScalar.BLUE, 0, 0, 0 );
System.out.println(boundbox.x()+", "+boundbox.y());
}
}
cvShowImage("contures", gry);
cvWaitKey(0);
但它不会在对象周围绘制为矩形。 我想知道我是否可以使用cvFindContours方法来识别这些对象? 请问有人可以解释如何使用javacv / opencv存档我的目标吗?
尝试通过以下代码,它将为您的问题提供答案。
IplImage img=cvLoadImage("pathtosourceimage");
CvSize cvSize = cvSize(img.width(), img.height());
IplImage gry=cvCreateImage(cvSize, img.depth(), 1);
cvCvtColor(img, gry, CV_BGR2GRAY);
cvThreshold(gry, gry, 200, 255, CV_THRESH_BINARY);
cvAdaptiveThreshold(gry, gry, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 11, 5);
CvMemStorage storage = CvMemStorage.create();
CvSeq contours = new CvContour(null);
int noOfContors = cvFindContours(gry, storage, contours, Loader.sizeof(CvContour.class), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE, new CvPoint(0,0));
CvSeq ptr = new CvSeq();
int count =1;
CvPoint p1 = new CvPoint(0,0),p2 = new CvPoint(0,0);
for (ptr = contours; ptr != null; ptr = ptr.h_next()) {
CvScalar color = CvScalar.BLUE;
CvRect sq = cvBoundingRect(ptr, 0);
System.out.println("Contour No ="+count);
System.out.println("X ="+ sq.x()+" Y="+ sq.y());
System.out.println("Height ="+sq.height()+" Width ="+sq.width());
System.out.println("");
p1.x(sq.x());
p2.x(sq.x()+sq.width());
p1.y(sq.y());
p2.y(sq.y()+sq.height());
cvRectangle(img, p1,p2, CV_RGB(255, 0, 0), 2, 8, 0);
cvDrawContours(img, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
count++;
}
cvShowImage("contures",img);
cvWaitKey(0);
这是我给你的图像得到的输出。
cvFindContours是解决您问题的正确方法。
我已经确认它适用于您的图像。
你有System.out.println,输出是什么?
使用cvFindContours可能很棘手,我把它包装成更通用的C ++函数 。 我还使用一个名为vBlob的类来描述cvFindContours检测到的对象 。 从我从java代码中看到的,java版本API与C / C ++版本非常相似。 所以重写它并不难。
PS。 阿斯特给出了正确的答案。
你知道findContours
函数在黑色背景上找到白色轮廓吗?
只需对您的图像执行bitwise_not
(或bitwise_not
模拟),然后应用findContours
。 这实际上是解决您的问题。
不需要第三方库! 您正在寻找的是使用称为边界框的技术在OpenCV 中实现的 :
诀窍是使用cvFindContours()
来检索轮廓,然后使用cvApproxPoly()
来改善结果。 请注意,您必须使用cvNot()
反转输入图像的颜色,因为cvFindContours()
搜索白色轮廓。
顺便说一句, cvMinEnclosingCircle()
返回圆的中心为CvPoint2D32f
。
我使用c ++ api,但我认为在javacv中也应该有一些名为drawContours或cvDrawContours的函数,它使用findContours的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.