如何使用OPENCV从图像中检测特定数字?

如何使用OPENCV从图像中检测特定数字?,opencv,image-processing,ocr,template-matching,Opencv,Image Processing,Ocr,Template Matching,我住在土耳其,在土耳其,电视广告正在做一些倒计时,告诉我们离电视节目或电影开始还有多少分钟 我要做的是抓住00:59秒,或者仅仅抓住柜台上的第二个“0”。alghoritm必须了解“0”是“0”,而不是任何其他数字 之后,我尝试了模板匹配模板图像,但它也检测到错误的数字 所以我不知道哪种方法最好 我试图从这些帧中检测: 如您所见,它检测到的是“1”而不是“0” 下面是我与模板匹配的代码 #include<opencv2/highgui/highgui.hpp> #include

我住在土耳其,在土耳其,电视广告正在做一些倒计时,告诉我们离电视节目或电影开始还有多少分钟

我要做的是抓住00:59秒,或者仅仅抓住柜台上的第二个“0”。alghoritm必须了解“0”是“0”,而不是任何其他数字

之后,我尝试了模板匹配模板图像,但它也检测到错误的数字

所以我不知道哪种方法最好

我试图从这些帧中检测:

如您所见,它检测到的是“1”而不是“0”

下面是我与模板匹配的代码

#include<opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <sstream>
using namespace cv;
using namespace std;

Mat frame;
Mat img; 
Mat templ; 
Mat templ_resized;
Mat templ_resized_bw;
Mat result;
cv::Mat sel;
cv::Mat img_final;
//**************

int main(int argc, char** argv)
{
    VideoCapture cap("/home/semih/Desktop/OPENCV_ON_LINUX/dizifiles/yenisoncalismalar/kanaldkucukaga.avi");
    if ( !cap.isOpened() )  
    {
        cout << "Cannot open the video file" << endl;
        return -1;
    }

    double fps = cap.get(CV_CAP_PROP_FPS); //get the frames per seconds of the video
    cout << "Frame per seconds : " << fps << endl;
    namedWindow("1",CV_WINDOW_AUTOSIZE);
    namedWindow("2",CV_WINDOW_AUTOSIZE);
    namedWindow("3",CV_WINDOW_AUTOSIZE);
    namedWindow("4",CV_WINDOW_AUTOSIZE);

    namedWindow("5",CV_WINDOW_AUTOSIZE);

    int counter=0;
    int check_counter=0;
    std::string s;

    cv::Rect myROI(699, 474, 10,16);  //location of the countdown Timer
    cv::Mat cropped;
    templ = imread("/home/semih/Desktop/OPENCV_ON_LINUX/dizifiles/yenisoncalismalar/sifir00.png",CV_LOAD_IMAGE_COLOR);
    cv::resize(templ,templ_resized,Size(8,11),CV_INTER_LINEAR);  //8 11

    Mat cropped_bw;
    double minVal; 
    double maxVal; 
    Point minLoc; 
    Point maxLoc;
    Point matchLoc;
    cv::Mat pic;

    while(1)
    {
        bool bSuccess = cap.read(frame);
        if (!bSuccess) 
        {
            cout << "Cannot read the frame from video file" << endl;
            break;
        }
        counter=counter+1;

        cv::Mat croppedRef(frame, myROI);
        cvtColor(croppedRef,cropped_bw,CV_RGB2GRAY);
        cropped_bw = cropped_bw > 200;
        cvtColor(templ_resized,templ_resized_bw,CV_RGB2GRAY);
        templ_resized_bw=templ_resized_bw>200;

        imshow("1",cropped_bw);
        imshow("2",frame);
        imshow("3",templ);
        imshow("4",templ_resized_bw);

        int result_cols =  cropped_bw.cols - templ_resized_bw.cols + 1;
        int result_rows = cropped_bw.rows - templ_resized_bw.rows + 1;

        result.create( result_cols, result_rows, CV_32FC1 );
        matchTemplate( cropped_bw,templ_resized_bw, result, CV_TM_SQDIFF_NORMED);
        normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );
        minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

        matchLoc=minLoc;

        int dogrula;

        if(matchLoc.x>0){
            check_counter=check_counter+1;
        }

        if(check_counter>20){     // if it stays 20 frames, assume "detected
            cout<<"0 number detected"<<endl;
        }

        rectangle(cropped_bw, matchLoc, Point( matchLoc.x + templ_resized_bw.cols , matchLoc.y + templ_resized_bw.rows ), Scalar::all(100), 1, 8, 0 );
        imshow("5",cropped_bw);
        if(waitKey(30) == 27) 
        {
            cout << "esc key is pressed by user" << endl; 
            break; 
        }
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
垫架;
Mat-img;
垫模板;
调整了Mat templ_的尺寸;
Mat templ_尺寸调整后的_bw;
Mat结果;
cv::Mat sel;
cv::Mat img_最终版;
//**************
int main(int argc,字符**argv)
{
VideoCapture(“/home/semih/Desktop/OPENCV_ON_LINUX/dizifiles/yenisoncalismalar/kanaldkucukaga.avi”);
如果(!cap.isOpened())
{

cout当我试图搜索特定的和相同的号码时,我找到了这个解决方案。 这是比较两幅图像,好像它们是一样的

#include<opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <sstream>
using namespace cv;
using namespace std;


    Mat frame;
    Mat img; 
    Mat templ; 
    Mat templ_resized;
    Mat templ_resized_bw;
    Mat result;
    cv::Mat sel;
    cv::Mat img_final;
  //**************
int detect()
    {
VideoCapture cap("/home/semih/Desktop/OPENCV_ON_LINUX/dizifiles/yenisoncalismalar/Final/kucukaga2.avi");
   if ( !cap.isOpened() )  
    {
         cout << "Cannot open the video file" << endl;
         return -1;
    }

double fps = cap.get(CV_CAP_PROP_FPS); //get the frames per seconds of the video
  cout << "Frame per seconds : " << fps << endl;


int counter=0;
int check_counter=0;
    std::string s;

cv::Rect myROI(702, 476, 11,16);   // location of countdown timer



    cv::Mat cropped;
    templ = imread("/home/semih/Desktop/OPENCV_ON_LINUX/dizifiles/yenisoncalismalar/Final/thresh747.png",CV_LOAD_IMAGE_COLOR);
cv::resize(templ,templ_resized,Size(45,45),CV_INTER_LINEAR);  //8 11

    Mat cropped_bw;
    double minVal; 
    double maxVal; 
    Point minLoc; 
    Point maxLoc;
    Point matchLoc;
    cv::Mat pic;

while(1)
        {
        bool bSuccess = cap.read(frame);

         if (!bSuccess) 
        {
                        cout << "Cannot read the frame from video file" << endl;
                       break;
        }
counter=counter+1;


cv::Mat croppedRef(frame, myROI);
cvtColor(croppedRef,cropped_bw,CV_RGB2GRAY);

cv::resize(cropped_bw,cropped_bw,Size(45,45),CV_INTER_LINEAR);

cropped_bw = cropped_bw > 200;

cvtColor(templ_resized,templ_resized_bw,CV_RGB2GRAY);
templ_resized_bw=templ_resized_bw>200;


cv::Mat result2;
Mat croppedsimilar;

Mat templ_resized_re;
Mat templ_cvt;

cvtColor(templ_resized, templ_cvt, CV_BGR2GRAY);



cv::resize(templ_cvt,templ_resized_re,Size(45,45),CV_INTER_LINEAR);
cv::resize(cropped_bw,croppedsimilar,Size(45,45),CV_INTER_LINEAR);

templ_resized_re=templ_resized_re>200;
croppedsimilar=croppedsimilar>200;

imshow("111",croppedsimilar);
imshow("222",templ_resized_re);

int threshold = (double)(templ_resized_re.rows * templ_resized_re.cols) * 0.97; 
// Search for almost same match

cv::compare(croppedsimilar ,  templ_resized_re , result2 , cv::CMP_EQ );


int similarPixels  = countNonZero(result2);

if ( similarPixels  > threshold ) {
   cout << "number '0' found !!!!!" << endl;
}




if(waitKey(30) == 27) 
       {
                cout << "esc key is pressed by user" << endl; 
                break; 
       }

}


return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间cv;
使用名称空间std;
垫架;
Mat-img;
垫模板;
调整了Mat templ_的尺寸;
Mat templ_尺寸调整后的_bw;
Mat结果;
cv::Mat sel;
cv::Mat img_最终版;
//**************
int detect()
{
VideoCapture(“/home/semih/Desktop/OPENCV_ON_LINUX/dizifiles/yenisoncalismalar/Final/kucukaga2.avi”);
如果(!cap.isOpened())
{
它在第二张图像的“01:53”中是否检测到“1”。我在第一张图像上没有看到任何检测。你所说的“正如你所见,它检测到的是“1”而不是“0”是什么意思?也许他是指它检测到的是“0”而不是“1”?