opencv - matchTemplate 与 openCV 在 Java 中

标签 opencv

我有这样的代码:

Mat img = Highgui.imread(inFile);
Mat templ = Highgui.imread(templateFile);
int result_cols = img.cols() - templ.cols() + 1;
int result_rows = img.rows() - templ.rows() + 1;
Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
Imgproc.matchTemplate(img, templ, result, Imgproc.TM_CCOEFF);
/////Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());
for (int i = 0; i < result_rows; i++)
for (int j = 0; j < result_cols; j++) 
  if(result.get(i, j)[0]>?)

     //match!

我需要解析输入图像以找到多次出现的模板图像。我想要这样的结果:

result[0][0]= 15%
result[0][1]= 17%
result[x][y]= 47%

如果我使用 TM_COEFF 所有结果都是 [-xxxxxxxx.xxx,+xxxxxxxx.xxx]

如果我使用 TM_SQDIFF 所有结果都是 xxxxxxxx.xxx

如果我使用 TM_CCORR,所有结果都是 xxxxxxxx.xxx

如何检测匹配或不匹配? if 的正确条件是什么? 如果我对矩阵进行归一化,应用程序会将值设置为 1,并且我无法检测到模板是否未存储到图像中(全部不匹配)。

提前致谢

最佳答案

您可以将“_NORMED”附加到方法名称(例如:C++ 中的 CV_TM_COEFF_NORMED;在 Java 中可能略有不同)以获得适合您目的的合理值。

“合理”是指您将获得 0 到 1 范围内的值,可以根据您的目的乘以 100。

注意:对于 CV_TM_SQDIFF_NORMED,它将在 -1 到 0 的范围内,您必须从 1 中减去该值才能理解它,因为如果在此方法中使用,则为最低值。

提示:您可以使用与 minMaxLoc() 等效的 java 来获取最小值和最大值。与 matchtemplate 结合使用时非常有用。 我相信位于 Core 类内部的“minMaxLoc”。

这是一个 C++ 实现:

matchTemplate( input_mat, template_mat, result_mat, method_NORMED );

double minVal, maxVal; 

double percentage;

Point minLoc; Point maxLoc;

minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
if( method_NORMED == CV_TM_SQDIFF_NORMED )
{
   percentage=1-minVal;
}
else
{
   percentage=maxVal;
}

有用的 C++ 文档: 匹配模板描述和可用方法:http://docs.opencv.org/modules/imgproc/doc/object_detection.html MinMaxLoc 文档: http://docs.opencv.org/modules/core/doc/operations_on_arrays.html?highlight=minmaxloc#minmaxloc

关于opencv - matchTemplate 与 openCV 在 Java 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17762846/

相关文章:

iphone - 从 UIImagePickerController SourceType 相机获取全高清图像,无需单击捕获按钮

python - 如何在flutter中使用starflut导入python包?

opencv - 如何调整cvtColor灰度功能,使其保持RGB尺寸

opencv - 用于语义分割的单热标签

c++ - 使用库依赖项的相对路径,

python - ROS 图像订阅滞后

opencv - 相机标定(OpenCV 2.3)——如何使用畸变参数?

使用 Python OpenCV 进行图像重复模式检测

python - 从图表中提取绘图线

python - 使用相位相关和对数极坐标变换获得旋转位移