Video [Java]

时间:2017-01-31 20:33:45

标签: java opencv template-matching

请我尝试在java中创建一个新的应用程序来匹配图片和视频,图片中的模板匹配工作正常,但是当我尝试为视频做的时候我总是有这样的错误信息:

  

OpenCV错误:断言失败((深度== CV_8U ||深度== CV_32F)&&   type == _templ.type()&& _img.dims()< = 2)在cv :: matchTemplate,file中   C:\建立\ master_PackSlaveAddon-Win64的-VC12静电\的OpenCV \模块\ imgproc \ SRC \ templmatch.cpp,   第1062行“main”CvException中的异常   [org.opencv.core.CvException:cv :: Exception:   C:\建立\ master_PackSlaveAddon-Win64的-VC12静电\的OpenCV \模块\ imgproc \ SRC \ templmatch.cpp:1062:   错误:(-215)(深度== CV_8U ||深度== 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;
         }

        }

    }

1 个答案:

答案 0 :(得分:0)

确保您正在正确访问视频,以便使用:

while(camera.read(frame)) 

因为,这是一个视频,您需要访问其中的所有帧,以便在使用时使用。

还有你的结果图片,即

Mat result = new Mat();

必须如下所示,以便两个图像具有相同的大小并且具有相同的颜色代码。

所以改成它,

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

运行代码并告诉我它的工作天气..