Click here to Skip to main content
15,888,968 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
um wrote a code using template matching method for detect stamp in the envelops. but this program run in the slowly. what is the reason? the video refresh every 1 sec. i wanna reduce that time, is this possible? this is my code. my laptop have core i3 and 4GB ram under win10 technical preview. use opencv 2.4.10 and visual studio 10

#include <iostream>
#include "opencv2/opencv.hpp"
#include 
#include 
#include 
#include <windows.h>

//#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;
HANDLE hSerial = CreateFile(L"\\\\.\\COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
char outputChars[5] = {};
	DWORD btsIO;




///------- template matching -----------------------------------------------------------------------------------------------

Mat TplMatch( Mat &img, Mat &mytemplate )
{
  Mat result;

  matchTemplate( img, mytemplate, result, CV_TM_SQDIFF_NORMED );
  normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

  return result;
}


///------- Localizing the best match with minMaxLoc ------------------------------------------------------------------------

Point minmax( Mat &result )
{
  double minVal, maxVal;
  Point  minLoc, maxLoc, matchLoc;

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

  return matchLoc;
}


///------- tracking --------------------------------------------------------------------------------------------------------

void track()
{
roiImg=imread("stamp1.jpg");

			mytemplate=imread("stamp1.jpg");
    if (select_flag)
    {
        //roiImg.copyTo(mytemplate);
//         select_flag = false;
        go_fast = true;
    }

//     imshow( "mytemplate", mytemplate ); waitKey(0);
	
    Mat result  =  TplMatch( img, mytemplate );
    Point match =  minmax( result ); 

    rectangle( img, match, Point( match.x + mytemplate.cols , match.y + mytemplate.rows ), CV_RGB(255, 0, 255), 1 );
	char test[32];
	//char testy[32];
sprintf(test,"%dx\n%dy\n", (int)match.x, (int)match.y);
//	sprintf(testx,"%dx\n", (int)match.x);
	//WriteFile(hSerial, testx, strlen(testx), &btsIO, NULL);
//sprintf(testy,"%dy\n", (int)match.y);

		//WriteFile(hSerial, "kjl" ,4,&btsIO,NULL);
WriteFile(hSerial, test, strlen(test), &btsIO, NULL);



    std::cout << "match: " << match << endl;

    /// latest match is the new template
    Rect ROI = cv::Rect( match.x, match.y, mytemplate.cols, mytemplate.rows );
   /* roiImg = img( ROI );
    roiImg.copyTo(mytemplate);
    imshow( "roiImg", roiImg ); //waitKey(0);*/
}


///------- 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);
        roiImg.copyTo(mytemplate);
		roiImg=imread("stamp1.jpg");
  imshow("MOUSE roiImg", roiImg); waitKey(0);
    }

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



///------- Main() ----------------------------------------------------------------------------------------------------------

int main()
{


if (hSerial !=INVALID_HANDLE_VALUE)
    {
        printf("Port opened! \n");

        DCB dcbSerialParams;
        GetCommState(hSerial,&dcbSerialParams);

        dcbSerialParams.BaudRate = CBR_9600;
        dcbSerialParams.ByteSize = 8;
        dcbSerialParams.Parity = NOPARITY;
        dcbSerialParams.StopBits = ONESTOPBIT;

        SetCommState(hSerial, &dcbSerialParams);
	}
	else
	{
		if (GetLastError() == ERROR_FILE_NOT_FOUND)
		{
			printf("Serial port doesn't exist! \n");
		}

		printf("Error while setting up serial port! \n");
	}



    int k;
   
///open webcam
    VideoCapture cap(0);
    if (!cap.isOpened())
      return 1;

    ///open video file
   // VideoCapture cap;
    //cap.open( "Megamind.avi" );
    if ( !cap.isOpened() )
    {   cout << "Unable to open video file" << endl;    return -1;    }    
  /*  /// Set video to 320x240
     cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
     cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);*/

    cap >> img;

    GaussianBlur( img, img, Size(7,7), 3.0 );
    imshow( "image", img );

	

    while (1)
    {

		cap >> img;
        if ( img.empty() )
            break;

    // Flip the frame horizontally and add blur
    cv::flip( img, img, 1 );
    GaussianBlur( img, img, Size(7,7), 3.0 );

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

        imshow("image", img);
//  waitKey(100);   k = waitKey(75);
    k = waitKey(go_fast ? 30 : 10000);
        if (k == 27)
            break;
    }
	  CloseHandle(hSerial);

    return 0;
}
Posted
Updated 6-Jun-15 21:02pm
v2

1 solution

There are several methods to speed things up:

- use a smaller template
- sub-sample the image and template and thereby reduce the size of the template
- use a less compute intensive matching method (if you can), for example CV_TM_SQDIFF (that depends on your image material)
- match the black-and-white image / template instead of a color image
- use a less compute intensive blur methode (or try to work without the blur)
- use the last found position to speed up the match and the finding of the max position

There are really many things you can try. But as always, it will take some time to optimize your program.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900