Hi , I am not able to match the template with any of the template matching methods
Here is my code. I am using iPhone 6S for testing this functionality. Please correct me if any thing is missing the code and to match the templates correctly. Also please let me know how can I save the captured image into my device or Mac?
My template size is 610*417
videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView];
videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack; // Use the back camera
videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset640x480;
videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationLandscapeLeft; // Ensure proper orientation
videoCamera.rotateVideo = YES; // Ensure proper orientation
videoCamera.defaultFPS = 30; // How often 'processImage' is called, adjust based on the amount
videoCamera.delegate = self;
- (void)processImage:(cv::Mat &)img {
cv::Mat gimg;
// Convert incoming img to greyscale to match template
cv::cvtColor(img, gimg, CV_BGR2GRAY);
// Check for matches with a certain threshold to help with scaling and angles
cv::Mat res(gimg.rows-gtpl.rows+1, gimg.cols-gtpl.cols+1, CV_32FC1);
cv::matchTemplate(gimg, gtpl, res, CV_TM_SQDIFF_NORMED);
//cv::matchTemplate(gimg, gtpl, res, CV_TM_SQDIFF_NORMED);
// cv::threshold(gimg, gimg, 127, 255, CV_THRESH_TOZERO);
//cv::threshold(res, res, 0.5, 1., CV_THRESH_TOZERO);
//cv::normalize( res, res, 0, 1, NORM_MINMAX, -1, Mat() );
double minval, maxval;
// double threshold = 0.15;
cv::Point minloc, maxloc, matchLoc;
cv::minMaxLoc(res, &minval, &maxval, &minloc, &maxloc);
cout << "min: " << minval<<" maxval "<<maxval<<"\n";
cout << "minloc: " << minloc.x<<" maxloc "<<maxloc;
// If it's a good enough match
if (minval <0.25)
{
// Draw a rectangle for confirmation
cv::rectangle(img, maxloc, cv::Point(maxloc.x + gtpl.cols, maxloc.y + gtpl.rows), CV_RGB(0,255,0), 2);
cv::floodFill(res, maxloc, cv::Scalar(0), 0, cv::Scalar(.1), cv::Scalar(1.));
// Call our delegates callback method
[delegate matchedItem];
}
}
"My template size is 610*417" -- that's huge ! (esp. if your video feed is 640x480)
you'll only have a small room left at the left/top to look for it.
ok, what should I give instead of AVCaptureSessionPreset640x480
sorry, i have no idea about your setup. just saying, that using a large template will take a lot of time.
are you even sure, it is fully visible in your scene, and has exactly the same size as in your video feed ?
(if not so, it won't scale by magic, it will just not detect anything)