通过OpenCV或JavaCV进行模板匹配

时间:2014-06-02 15:55:58

标签: java opencv image-processing javacv

我需要用Java实现模板匹配方法。我找到了OpenCV和JavaCV来解决这个问题。从OpenCV开始,我在http://www.tutorialspoint.com/找到了一些教程(不知道为什么,但最多只能创建一个黑色图像)。无论......

现在我想尝试一下:

http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

但我不知道如何在Java中使用它(OpenCV和JavaCV在Eclipse中提供)。

对于JavaCV的情况,我找到了以下代码:

IplImage src = cvLoadImage("new.png");
IplImage tmp = cvLoadImage("old.png");

IplImage result = cvCreateImage(cvSize(src.width()-tmp.width()+1, src.height()-    tmp.height()+1), IPL_DEPTH_32F, 1);
cvZero(result);

//Match Template Function from OpenCV
cvMatchTemplate(src, tmp, result, CV_TM_CCORR_NORMED);

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

CvPoint minLoc = new CvPoint();
CvPoint maxLoc = new CvPoint();

//Get the Max or Min Correlation Value      
cvMinMaxLoc(result, min_val, max_val, minLoc, maxLoc, null);

System.out.println(Arrays.toString(min_val));
System.out.println(Arrays.toString(max_val));

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 a Rectangle for Matched   Region

cvShowImage("Lena Image", src);
cvWaitKey(0);
cvReleaseImage(src);
cvReleaseImage(tmp);
cvReleaseImage(result);

但是我传递的文件却出现了NullPointerException。

有没有人可以使用模板与OpenCV或JavaCV匹配的示例,还是有一种简单的方法可以在没有任何库的情况下完成此任务?

1 个答案:

答案 0 :(得分:4)

我个人尝试使用OpenCV的Java绑定做任何事情。当某些东西不适用于OpenCV的Java绑定时,我会回到JavaCV。 JavaCV看起来不错,它的开发人员似乎在OpenCV发布后很快发布了新版本,但从长远来看,我的猜测是OpenCV的java绑定将得到更好的支持。

到目前为止我发现的唯一一个在OpenCV中无效的区域是面部识别和分类功能。

这是一个用于模板匹配的OpenCV Java。我已经省略了交换多个模板的循环,并通过查看mmr中的结果找到最佳匹配。

Mat mat = ...
Mat matTemplate = ...
// Create the result matrix
int resultCols = mat.cols() - matTemplate.cols() + 1;
int resultRows = mat.rows() - matTemplate.rows() + 1;
if ( resultCols > 0 && resultRows > 0 ) {   
Mat result = new Mat(resultRows, resultCols, CvType.CV_8UC1);
// Do the Matching
Imgproc.matchTemplate(mat, matTemplate, result, Imgproc.TM_CCOEFF_NORMED);
//  Normalize???
// Localizing the best match with minMaxLoc
MinMaxLocResult mmr = Core.minMaxLoc(result);

我相信你可以找到一些关于如何在Java中使用OpenCV进行模板匹配的好资源。我知道我做了。