java - 通过 OpenCV 或 JavaCV 进行模板匹配

标签 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 一起使用(Eclipse 中提供了 OpenCV 和 JavaCV)。

对于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 的模板匹配,或者是否有一种简单的方法无需任何库即可完成此任务?

最佳答案

就我个人而言,如果可能的话,我会尝试使用 OpenCV 的 Java 绑定(bind)来完成所有操作。当 OpenCV 的 Java 绑定(bind)无法正常工作时,我会转而使用 JavaCV。 JavaCV 看起来不错,而且它的开发人员似乎在 OpenCV 发布后不久就发布了新版本,但从长远来看,我的猜测是 OpenCV 的 java 绑定(bind)将得到更好的支持。

到目前为止,我发现 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 进行模板匹配的好资源。我知道我做到了。

关于java - 通过 OpenCV 或 JavaCV 进行模板匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23998603/

相关文章:

c++ - 调整视频捕获的分辨率

Java Ganymed-SSH - 从缓冲区读取时挂起

Java 页面对象模型最佳实践 - 新对象

java - Java 的免费时间线可视化 API?

python - 指纹识别系统

c++ - 在openCV中显示两个相互重叠的图像

java - 为什么方法会更改 boolean 数组参数?

c++ - 更改 cv::Mat 图像的类型(解释)

java - 在android中使用边缘检测选择区域后裁剪图像

algorithm - 有没有超快的算法可以在图片上找到线条?