2013-08-22 3 views
0

Я новичок в OpenCV. Я делаю приложение, которое сообщает пользователю, что данное изображение предоставило шаблон или нет. Я использовал этот код. Он отлично подходит. Но он не определяет, имеет ли данный образ не соответствующий шаблон. Когда я читаю, он переходит к самому высокому значению и показывает мне ложный результат (показывает где-то еще на изображении). Я читал о minVal и maxVal. Но я все еще не мог понять, что он делает. Потому что я отлаживал код. каждый раз, когда minVal равно 0.0, а maxVal - 255.0 (даже изображение содержит шаблон или нет, я имею в виду каждый раз.). Я застрял здесь. Пожалуйста, помогите мне показать только правильные результаты.Как получить точное соответствие Использование шаблона в OpenCV (в Android)?

 Utils.bitmapToMat(bmp2, mFind); 
     Utils.bitmapToMat(bmp1, Input); 
     Utils.bitmapToMat(bmp3, mResult9u); 

     Imgproc.matchTemplate(mFind, Input, mResult, matcher); 

     Core.normalize(mResult, mResult8u, 0, 255, Core.NORM_MINMAX, CvType.CV_8U); 

     Point matchLoc; 

     MinMaxLocResult minMaxLoc = Core.minMaxLoc(mResult8u); 

     /// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better 
     if (matcher == Imgproc.TM_SQDIFF || matcher == Imgproc.TM_SQDIFF_NORMED) 
     { 
      matchLoc = minMaxLoc.minLoc; 
     } 
     else 
     { 
      matchLoc = minMaxLoc.maxLoc; 
     } 
     float thresholdMatchForMin = 0.02f; 
     float thresholdMatchForMax = 0.08f; 
     //    minMaxLoc.minVal < thresholdMatchForMin || 
     if (minMaxLoc.maxVal > thresholdMatchForMax) 
     { 
      /// Show me what you got 
      Core.rectangle(mResult9u, matchLoc, 
       new Point(matchLoc.x + Input.cols(), matchLoc.y + Input.rows()), new Scalar(0, 255, 255, 0)); 
      Utils.matToBitmap(mFind, bmp2); 
      Utils.matToBitmap(mResult9u, bmp3); 
      Paint paint = new Paint(); 
      paint.setColor(Color.RED); 
      Canvas canvas = new Canvas(bmp2); 
      canvas.drawRect(new Rect((int) matchLoc.x, (int) matchLoc.y, (int) (matchLoc.x + Input.cols()), 
       (int) (matchLoc.y + Input.rows())), paint); 
     } 

ответ

0

Линия:

Core.normalize(mResult, mResult8u, 0, 255, Core.NORM_MINMAX, CvType.CV_8U); 

нормализует результат. Он делает любой диапазон равным 0-255. Если вы хотите, чтобы реальные значения корреляции использовали не нормированный mResult.

+0

спасибо. вы имеете в виду передать mResult в Core.minMaxLoc()? Я пытался. Но у меня такой же результат. – ssdehero

+0

Вы посмотрели, какое значение находится в матрице mResult в координатах matchLoc? TM_SQDIFF_NORMED должен давать результат в диапазоне 0-1. –

+0

nope. Всегда я получаю 0-255. Кажется, я что-то пропустил. Но я не знаю, что ... – ssdehero