2017-01-31 4 views
1

, пожалуйста, я пытаюсь создать новое приложение в java для соответствия изображению и видео, совпадение шаблона в изображении работает нормально, но когда я пытаюсь сделать это для видео, у меня всегда есть эта ошибка сообщение:Шаблон соответствия OpenCv в видео [Java]

OpenCV Error: Assertion failed ((depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2) in cv::matchTemplate, file C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\templmatch.cpp, line 1062 Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\imgproc\src\templmatch.cpp:1062: error: (-215) (depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2 in function cv::matchTemplate ]

Это моя функция для сопоставления видео с изображением, кто-то может помочь.

public int runVedio(String inFile, String templateFile, int match_method) { 
     int nbr = 0; 
     Mat templ = Imgcodecs.imread(templateFile); 

     VideoCapture capture=new VideoCapture(inFile); 
     Mat frame = new Mat(); 
     Mat result = new Mat(); 
     capture.read(frame); 

     ///Do the Matching and Normalize 
     Imgproc.matchTemplate(frame,templ, result, match_method); 
     Imgproc.threshold(result, result,0.9,1,Imgproc.THRESH_TOZERO); 

     //Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat()); 
     while(true) 
     { 
     ///Localizing the best match with minMaxLoc 
     Core.MinMaxLocResult mmr = Core.minMaxLoc(result); 

     Point matchLoc; 
     if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) { 
      matchLoc = mmr.minLoc; 
     } else { 
      matchLoc = mmr.maxLoc; 
     } 
     if(mmr.maxVal > 0.98) 
     { 
      ///Show me what you got 
      Imgproc.rectangle(frame, matchLoc, 
       new Point(matchLoc.x + templ.cols(),matchLoc.y + templ.rows()), 
       new Scalar(0,255,0),2); 
      Imgproc.rectangle(result, matchLoc, 
       new Point(matchLoc.x + templ.cols(),matchLoc.y + templ.rows()), 
       new Scalar(0,255,0),-1);  
      nbr++; 
     } 
     else 
     { 
      return nbr; 
     } 

     } 

    } 

ответ

0

убедитесь, что вы получаете доступ к видео правильно для этого вы можете использовать:

while(camera.read(frame)) 

Поскольку это видео вам необходимо получить доступ всех кадров в нем так использовать время.

А также ваш результат изображения

т.е.
Mat result = new Mat(); 

должен идти, как ниже, так что оба изображения имеют одинаковый размер и имеют тот же цветовой код.

Так измените его на это,

new Mat(frame.rows(), frame.cols(), Highgui.CV_LOAD_IMAGE_COLOR); 

Выполнить код и скажите мне, погода это работает ..