OpenCV 错误消息(匹配模板) [英] OpenCV error message (Matchtemplate)

查看:83
本文介绍了OpenCV 错误消息(匹配模板)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我找到了这个源代码,用于将图像与视频进行比较,它有时可以工作,但大多数时候却没有,我收到此错误消息.

I found this source code for comparing images to a video it works sometimes but most of the times it doesn't and I get this error message.

"OpenCV 错误:断言失败 < == CV_8U :: img.depth<> == CV_32F>&&img.type<> == templ.type<>> in cv::matchTemplate, file ........\opencv\modules\imgproc\src\templmatch.cpp, line 249"

"OpenCV Error: Assertion failed < == CV_8U :: img.depth<> == CV_32F> && img.type<> == templ.type<>> in cv::matchTemplate, file ........\opencv\modules\imgproc\src\templmatch.cpp, line 249"

我不知道如何解决这个问题..

I have no clue how to fix this..

这是我的源代码,谁能指出我正确的方向?:

Here is my source code can anyone point me in right direction?:

#include <iostream>
#include "opencv2/opencv.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>

#include <sstream>


using namespace cv;
using namespace std;

Point point1, point2; /* vertical points of the bounding box */
int drag = 0;
Rect rect; /* bounding box */
Mat img, roiImg; /* roiImg - the part of the image in the bounding box */
int select_flag = 0;
bool go_fast = false;

Mat mytemplate;

void track(cv::Mat &img, const cv::Mat &templ, const cv::Rect &r )
{
    static int n = 0;

    if (select_flag)
    {
        templ.copyTo(mytemplate);
        select_flag = false;
        go_fast = true;
    }


    cv::Mat result;
    /// Do the Matching and Normalize
    matchTemplate( img, mytemplate, result, CV_TM_SQDIFF_NORMED );
    normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

    /// Localizing the best match with minMaxLoc
    double minVal; double maxVal; Point minLoc; Point maxLoc;
    Point matchLoc;

    minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
    matchLoc = minLoc;

    rectangle( img, matchLoc, Point( matchLoc.x + mytemplate.cols , matchLoc.y + mytemplate.rows ), CV_RGB(255, 255, 255), 3 );

    std::cout << matchLoc << "\n";
}

///MouseCallback function

void mouseHandler(int event, int x, int y, int flags, void *param)
{
    if (event == CV_EVENT_LBUTTONDOWN && !drag)
    {
        /* left button clicked. ROI selection begins */
        point1 = Point(x, y);
        drag = 1;
    }

    if (event == CV_EVENT_MOUSEMOVE && drag)
    {
        /* mouse dragged. ROI being selected */
        Mat img1 = img.clone();
        point2 = Point(x, y);
        rectangle(img1, point1, point2, CV_RGB(255, 0, 0), 3, 8, 0);
        imshow("image", img1);
    }

    if (event == CV_EVENT_LBUTTONUP && drag)
    {
        point2 = Point(x, y);
        rect = Rect(point1.x, point1.y, x - point1.x, y - point1.y);
        drag = 0;
        roiImg = img(rect);
    }

    if (event == CV_EVENT_LBUTTONUP)
    {
        /* ROI selected */
        select_flag = 1;
        drag = 0;
    }

}


///Main function

int main()
{
    int k;
    /*
        VideoCapture cap(0);
        if (!cap.isOpened())
        return 1;
    */

    VideoCapture cap;
    //cap.open("~/Downloads/opencv-2.4.4/samples/cpp/tutorial_code/HighGUI/video-input-psnr-ssim/video/Megamind.avi");
    cap.open("./Megamind.avi");
    if (!cap.isOpened())
    {
        printf("Unable to open video file\n");
        return -1;
    }

    /*
        // Set video to 320x240
        cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
        cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
        */

    cap >> img;
    imshow("image", img);
    freopen("out.txt","w",stdout);
    while (1)
    {
        cap >> img;
        if (img.empty())
            break;

        if (rect.width == 0 && rect.height == 0)
            cvSetMouseCallback("image", mouseHandler, NULL);
        else
            track(img, roiImg, rect);

        if (select_flag == 1)
            imshow("Template", roiImg);

        imshow("image", img);
        k = waitKey(go_fast ? 30 : 10000);
        if (k == 27)
            break;

    }


    return 0;
}

推荐答案

我认为问题是,如果假设您的 mouseHandler() 函数无法执行您设置 select_flag = 1 变量的最后一个条件,那么你的 track() 函数就不会执行这个

I think the problem is, if suppose your mouseHandler() function is unable to execute last condition where you are setting select_flag = 1 variable, then your track() function would not execute this

if (select_flag)
{
    templ.copyTo(mytemplate);
    select_flag = false;
    go_fast = true;
}

如果它发生了,那么

matchTemplate( img, mytemplate, result, CV_TM_SQDIFF_NORMED ); 

函数将匹配 imgCV_32FmytemplateCV_8U 因为上面是 if(select_flag) 条件未执行,因此 mytemplate 中没有复制任何内容.这就是为什么您会收到此错误 [CV_8U != CV_32F],正如您所说,它正在运行一段时间,只是因为您的处理程序有时有效,有时无效.

function is going to match img which is CV_32F with mytemplate which is CV_8U because above if(select_flag) condition was not executed so nothing was copied in mytemplate. thats why you are getting this error [CV_8U != CV_32F], and as you said that it is running some time just because your handler some times work and some times not.

这篇关于OpenCV 错误消息(匹配模板)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆