Компьютерное зрение

preview_player
Показать описание
Пример работы с OpenCV
Поиск объекта по шаблону.
Рекомендации по теме
Комментарии
Автор

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>
#include "videoInput.h"


IplImage* image = 0;
IplImage* templ = 0;
char* filename = "red.jpg"; //общее изображение
double    minval, maxval;
CvPoint    minloc, maxloc;




int main(int argc, char* argv[])
{
  // шаблон
        char* filename2 = "sred.jpg";
        templ = cvLoadImage(filename2, 1);
        assert( templ != 0 );

// размер шаблона
        int width = templ->width;
        int height = templ->height;

        // создание объекта videoInput
        videoInput VI;

        // получение списка доступных видеоустройств, возвращается число устройств
        int numDevices = VI.listDevices();
        int device1=0; // первое найденое видеоустройсво из списка

        // частота кадров
        VI.setIdealFramerate(device1, 15);

        // указываем разрешение
        VI.setupDevice(device1, 1280, 960, VI_COMPOSITE);

        // показать окошко настроек камеры

        // создаём картинку нужного размера
        image = cvCreateImage(cvSize(VI.getWidth(device1), VI.getHeight(device1)), IPL_DEPTH_8U, 3);

        cvNamedWindow("capture", CV_WINDOW_AUTOSIZE);


        while(1){
                if (VI.isFrameNew(device1)){
                        // первый параметр - индекс видеоустройсва
                        // второй - указатель на буфер для сохранения данных
                        // третий - флаг, определяющий менять ли местами B и R -составляющий
                        // четвёртый - флаг, определяющий поворачивать картинку или нет
                        VI.getPixels(device1, (unsigned char *)image->imageData, false, true); // получение пикселей в BGR


// изображение для хранения результата сравнения
        // размер результата: если image WxH и templ wxh, то result = (W-w+1)x(H-h+1)
        IplImage *res = cvCreateImage( cvSize( (image->width-templ->width+1), (image->height-templ->height+1)), IPL_DEPTH_32F, 1 );

        // сравнение изображения с шаблоном
        cvMatchTemplate(image, templ, res, CV_TM_SQDIFF);

      
        // определение лучшее положение для сравнения
        // (поиск минимумов и максимумов на изображении)
    
        cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0);
        
        // нормализуем
        cvNormalize(res, res, 1, 0, CV_MINMAX);
        

        // выделим область прямоугольником
        cvRectangle(image, cvPoint(minloc.x, minloc.y), cvPoint(minloc.x+templ->width-1, minloc.y+templ->height-1), CV_RGB(255, 0, 0), 1, 8);

                        // показываем картинку
                        cvShowImage("capture",  image);
                }

                char c = cvWaitKey(33);
                if (c == 27) { // ESC
                        break;
                }
        }

        // освобождаем ресурсы
        cvReleaseImage(& image);
        cvDestroyWindow("capture");

        // останавливаем видеозахват
        VI.stopDevice(device1);

        return 0;
}

Max