我有问题,但我不知道是什么!我有下一个代码,当我调试它时,调试器在
中停止IplImage iplGray = cvCreateImage(cvGetSize(iplUltima), 8, 1 );
CvMemStorage g_storage = null;
CvSeq contours = new CvSeq(iplGray);
opencv_imgproc.cvCvtColor(iplUltima, iplGray, opencv_imgproc.CV_BGR2GRAY);
opencv_imgproc.cvThreshold(iplGray, iplGray, 100, 255, opencv_imgproc.CV_THRESH_BINARY);
//HERE, the next line:
opencv_imgproc.cvFindContours(iplGray, g_storage, contours, CV_C, CV_C, CV_C);
cvZero(iplGray);
if(contours != null){
opencv_core.cvDrawContours(iplGray, contours, CvScalar.ONE, CvScalar.ONE, CV_C, CV_C, CV_C);
}
cvShowImage( "Contours", iplGray );
我认为它与CvSeq contours = new CvSeq(iplGray)有关;但我不明白为什么。 任何有用的想法?
答案 0 :(得分:4)
对于Contours Detection,我使用过这种方法。表现很好。
public static IplImage detectObjects(IplImage srcImage){
IplImage resultImage = cvCloneImage(srcImage);
CvMemStorage mem = CvMemStorage.create();
CvSeq contours = new CvSeq();
CvSeq ptr = new CvSeq();
cvFindContours(srcImage, 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);
cvRectangle( resultImage , cvPoint( boundbox.x(), boundbox.y() ),
cvPoint( boundbox.x() + boundbox.width(), boundbox.y() + boundbox.height()),
cvScalar( 0, 255, 0, 0 ), 1, 0, 0 );
}
return resultImage;
}
答案 1 :(得分:0)
这里的默认示例和另一个答案使用的语法类似于旧的OpenCV 1.x C API(以cv *为前缀的函数和类)。
OpenCV在OpenCV 2.x中引入了一个更新的C ++ API,它更简单易懂。 JavaCV还在最近的版本中添加了这种语法。
对于想要使用更新语法的人(类似于OpenCV C ++ API),这里有一个用于轮廓检测的JavaCV代码段 - (使用JavaCV 1.3.2)
Mat img = imread("/path/to/image.jpg",CV_LOAD_IMAGE_GRAYSCALE);
MatVector result = new MatVector(); // MatVector is a JavaCV list of Mats
findContours(img, result, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
// The contours are now available in "result"
// You can access them using result.get(index), check the docs linked below for more info