2017-01-31 329 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); 

运行的代码,并告诉我度过它的工作原理..