Шаблон соответствия OpenCv в видео [Java]

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

Ошибка OpenCV: утверждение не удалось ((depth == CV_8U || depth == CV_32F) && type == _templ.type () && _img.dims () ‹= 2) в cv :: matchTemplate, файл C: \ builds \ master_PackSlaveAddon -win64-vc12-static \ opencv \ modules \ imgproc \ src \ templmatch.cpp, строка 1062 Исключение в потоке "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 в функции 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;
         }

        }

    }

person Malek Ben el ouafi    schedule 31.01.2017    source источник


Ответы (1)


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

while(camera.read(frame)) 

Поскольку это видео, вам нужно получить доступ ко всем кадрам в нем, поэтому используйте while.

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

Mat result = new Mat();

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

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

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

Запустите код и скажите, погода работает ..

person Chandan Sr    schedule 24.03.2017