2013-06-19 3 views
0

Кто-то может объяснить мне, что означает эта ошибка в logcat?Ошибка OpenCV: утверждение не выполнено CvException в templmatch.cpp

06-19 11:52:56.198: ERROR/cv::error()(8272): OpenCV Error: Assertion failed (corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1) in void cv::crossCorr(const cv::Mat&, const cv::Mat&, cv::Mat&, cv::Size, int, cv::Point, double, int), file /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/templmatch.cpp, line 70 
06-19 11:52:56.208: ERROR/AndroidRuntime(8272): FATAL EXCEPTION: Thread-2151 
    CvException [org.opencv.core.CvException: /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/templmatch.cpp:70: error: (-215) corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1 in function void cv::crossCorr(const cv::Mat&, const cv::Mat&, cv::Mat&, cv::Size, int, cv::Point, double, int) 
    ] 
    at org.opencv.imgproc.Imgproc.matchTemplate_0(Native Method) 
    at org.opencv.imgproc.Imgproc.matchTemplate(Imgproc.java:7226) 
    at com.micaela.myapp.Eye.match(Eye.java:256) 
    at com.micaela.myapp.Eye.access$100(Eye.java:22) 
    at com.micaela.myapp.Eye$3.run(Eye.java:146) 
    at java.lang.Thread.run(Thread.java:856) 

Это исключение вызывается в этом фрагменте кода:

Mat res; 
    if ((roi.height() > MainActivity.tpl.height()) && (roi.width() > MainActivity.tpl.width())) { 
     res = new Mat(new Size(roi.cols() - MainActivity.tpl.cols() + 1, roi.rows() - MainActivity.tpl.rows() + 1), CvType.CV_32FC1); 
     Imgproc.matchTemplate(roi, MainActivity.tpl, res, Imgproc.TM_SQDIFF); 
     if (left) { 
      return new Point((eyeRect.x + this.roi.width() - matchRect.x - Math.round(Core.minMaxLoc(res).maxLoc.x + (MainActivity.tpl.width()/2))), 
        (Math.round(Core.minMaxLoc(res).maxLoc.y + (MainActivity.tpl.height()/2)) + matchRect.y + eyeRect.y)); 
     } else { 
      return new Point((Math.round(Core.minMaxLoc(res).maxLoc.x + (MainActivity.tpl.width()/2)) + matchRect.x + eyeRect.x), (Math.round(Core.minMaxLoc(res).maxLoc.y + (MainActivity.tpl.height()/2)) + matchRect.y + eyeRect.y)); 
     } 
    } 

на:

Imgproc.matchTemplate(roi, MainActivity.tpl, res, Imgproc.TM_SQDIFF); 

Я программирования в Android, используя opencv4android библиотеки, последнюю версию.

+0

является «roi» 1-канальным изображением? – Alexey

+0

Да, roi 1-канальный .. – user140888

ответ

1

Кажется, что размер вашего шаблона меньше 1x1 пикселя. OpenCV не может обрабатывать пустой шаблон.

+0

Нет, у меня напечатано его размер в logcat, а результат: 06-19 14: 58: 19.592: INFO/Tpl (8372): Tpl: 8x8 – user140888

+0

Просьба указать размер рояля слишком. – vyndor

+0

Его размер 06-19 18: 08: 50.691: INFO/Roi (4927): Roi размер: 13x18. – user140888

1

Убедитесь в том, что все аргументы вокруг matchTemplate() имеют соответствующий размер и тип. Из OpenCV документации:

  • image – Image where the search is running. It must be 8-bit or 32-bit floating-point.
  • templ – Searched template. It must be not greater than the source image and have the same data type.

Так что Сюр что roi имеет тот же тип, что MainActivity.tpl (они оба должны быть 8-битные или 32-бит с плавающей точкой). roi и MainActivity.tpl оба должны иметь 1 канал.

Кроме того, я не думаю, что вам необходимо выделить res; с res = new Mat(new Size(roi.cols() - MainActivity.tpl.cols() + 1, roi.rows() - MainActivity.tpl.rows() + 1), CvType.CV_32FC1);. Я думаю, если он не будет выделен, он будет создан автоматически при вызове matchTemplate (хотя для скорости рекомендуется использовать res).

+0

Вы были очень понятны в объяснении. Спасибо! Я предоставлю, чтобы убедиться, что все в порядке. – user140888

Смежные вопросы