#include <stdafx.h>
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>
CvCapture *capture;
IplImage *original, *sight, *frame, *result;
bool flag; // while (flag){;}
char c; //c = cvWaitKey(33);
int main(int argc, char* argv[])
{ // получаем любую подключенную камеру
capture = cvCreateCameraCapture(-1);
assert( capture != 0 );
// получаем кадр
original = cvQueryFrame (capture);
// выводим в консоль информацию
printf( "[i] Camera\n");
printf( "[i] channels: %d\n", original->nChannels );
printf( "[i] pixel depth: %d bits\n", original->depth );
printf( "[i] width: %d pixels\n", original->width );
printf( "[i] height: %d pixels\n", original->height );
printf( "[i] image size: %d bytes\n", original->imageSize );
printf( "[i] width step: %d bytes\n", original->widthStep );
// создаем первое окно для отображения камеры
cvNamedWindow("Original",CV_WINDOW_AUTOSIZE);
// Цикл захвата изображения оригинала.
flag = true;
while(flag){
original = cvQueryFrame (capture);
cvShowImage("Original", original);
c = cvWaitKey(33);
if (c == 13)flag = false; //Для захвата нажать "ENTER"
}
// задаем область ROI по центру изображения original
int width_ROI = 50, heigth_ROI = 50;
int x_ROI = original->width / 2 - width_ROI / 2, y_ROI = original->height / 2 - heigth_ROI / 2;
int add = 200;
// устанавливаем ROI
cvSetImageROI(original, cvRect(x_ROI, y_ROI, width_ROI, heigth_ROI));
// создаем 8-ми битную 3-канальную картинку-прицел sight
sight = cvCreateImage(cvSize(width_ROI, heigth_ROI), 8, 3);
// выводим в консоль информацию о "прицельном" изображении
printf( "\r\n[i] Sight\n");
printf( "[i] channels: %d\n", sight->nChannels );
printf( "[i] pixel depth: %d bits\n", sight->depth );
printf( "[i] width: %d pixels\n", sight->width );
printf( "[i] height: %d pixels\n", sight->height );
printf( "[i] image size: %d bytes\n", sight->imageSize );
printf( "[i] width step: %d bytes\n", sight->widthStep );
// копируем изображение из области ROI с оригинала
cvCopyImage(original, sight);
assert( sight != 0 );
// добавляем величину add оригинал для визуализации области ROI
cvAddS(original, cvScalar(add), original);
// сбрасываем ROI
cvResetImageROI(original);
// показываем изображение original с "прицелом"
cvShowImage("Original",original);
// создаем второе окно для отображения с камеры
cvNamedWindow("Capture", CV_WINDOW_AUTOSIZE);
// создаем третье окно для отображения результата
cvNamedWindow("Result",CV_WINDOW_AUTOSIZE);
// создаем картинку result
result = cvCreateImage(cvSize(original->width - sight->width + 1, original->height - sight->height + 1), 32, 1);
double min, max;
CvPoint minpos, maxpos;
flag = true;
while(flag){
// получаем кадр
frame = cvQueryFrame (capture);
// обнулим resultat
cvZero(result);
// используем функцию сравнения регионов изображения
cvMatchTemplate(frame, sight, result, CV_TM_CCOEFF_NORMED);
cvNormalize(result, result, 1, 0, CV_MINMAX);
cvMinMaxLoc(result, &min, &max, &minpos, &maxpos);
cvCircle(frame, cvPoint(maxpos.x + sight->width / 2, maxpos.y + sight->height / 2), sight->height/2, cvScalar(0, 0, 255));
//printf("\r\n%5.3f; x = %d; y = %d", max, maxpos.x, maxpos.y);
cvShowImage("Capture", frame);
cvShowImage("Result", result);
c = cvWaitKey(33);
if (c == 27) flag = false; // "Esc" для выхода
}
// освобождаем память, выделенную под изображения*/
cvReleaseImage(&original);
cvReleaseImage(&sight);
cvReleaseImage(&frame);
cvReleaseImage(&result);
cvReleaseCapture(&capture);
// закрываем окна и освобождаем выделенную память
cvDestroyAllWindows();
return 0;
}