我正在尝试使用OpenCV(java)进行模板匹配,并使用最大最小值来确定是否找到了对象。
我正在使用以下java / opencv代码,但问题是,对于最佳匹配以及未找到匹配项的情况,它返回0.0的最小值。
因此,此模板匹配似乎不可靠,无法确定是否找到了对象。我在这段代码中做错了什么,或者我需要采用其他任何技术吗?
提前致谢。
int templateMatchMethod = Imgproc.TM_SQDIFF_NORMED;
Mat largeImage = Highgui.imread(largeUrl);
Mat smallImage = Highgui.imread(smallUrl);
boolean isMaxTypleMethod = true;
double TEMPLATE_MATCH_THRESHOLD = 0.8;
int result_cols = largeImage.cols() - smallImage.cols() + 1;
int result_rows = largeImage.rows() - smallImage.rows() + 1;
Mat result = new Mat(result_rows, result_cols, CvType.CV_8U);
Imgproc.matchTemplate(largeImage, smallImage, result, templateMatchMethod);
Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());
MinMaxLocResult mmr = Core.minMaxLoc(result);
Point matchLoc;
double minMaxValue = 1;
if (templateMatchMethod == Imgproc.TM_SQDIFF || templateMatchMethod == Imgproc.TM_SQDIFF_NORMED)
{
matchLoc = mmr.minLoc;
isMaxTypleMethod = false;
TEMPLATE_MATCH_THRESHOLD = 0.4;
minMaxValue = mmr.minVal;
}
else
{
matchLoc = mmr.maxLoc;
minMaxValue = mmr.maxVal;
}
Core.rectangle(largeImage, matchLoc, new Point(matchLoc.x + smallImage.cols(),
matchLoc.y + smallImage.rows()), new Scalar(0, 255, 0));
System.out.println("minMaxValue : "+minMaxValue);
if(isMaxTypleMethod && TEMPLATE_MATCH_THRESHOLD < minMaxValue)
{
System.out.println("Match found");
}
else if (!isMaxTypleMethod && TEMPLATE_MATCH_THRESHOLD > minMaxValue)
{
System.out.println("Match found");
}
答案 0 :(得分:4)
这看起来很可疑:
Mat result = new Mat(result_rows, result_cols, CvType.CV_8U); // better use CvType.CV_32F here
Imgproc.matchTemplate(largeImage, smallImage, result, templateMatchMethod);
Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat()); // normalizing a uchar mat into [0..1] can only result in garbage.
再次,如果你使用float类型作为结果并跳过normalize
,它会更好用答案 1 :(得分:0)
不要将结果标准化,我的意思是从代码中删除此行,
Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat()); // normalizing a uchar mat into
这样可以正常工作并且会给你正确的minmax值,