Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Приложение 2: исходный код модуля распознавания фигур






Код C++ #include < cv.h> #include < highgui.h> #include < stdlib.h> #include < stdio.h> #include < vector>   int figure_recognition(IplImage* frame) { //загружаем образец, с которым происходит сравнение std:: vector< IplImage*> t_source; t_source.push_back(cvLoadImage(" 0.bmp")); t_source.push_back(cvLoadImage(" 1.bmp")); t_source.push_back(cvLoadImage(" 2.bmp")); t_source.push_back(cvLoadImage(" 3.bmp")); t_source.push_back(cvLoadImage(" 4.bmp")); t_source.push_back(cvLoadImage(" 5.bmp")); t_source.push_back(cvLoadImage(" 6.bmp")); t_source.push_back(cvLoadImage(" 7.bmp")); std:: vector< double> k; k.push_back(0.000070); k.push_back(6.839972); k.push_back(0.000222); k.push_back(0.008111); k.push_back(0.034172); k.push_back(0.126583); k.push_back(2.095281); k.push_back(0.537611); //изображение для хранения контуров std:: vector< CvMemStorage*> t_contours_storage; CvMemStorage *frame_contours_storage = cvCreateMemStorage(0); //наборы контуров на изображении std:: vector< CvSeq*> t_seq_contours; CvSeq *frame_seq_contours = NULL; //изображения для градаций серого и контуров std:: vector< IplImage*> t_gray; std:: vector< IplImage*> t_edges; //для контура самой фигуры нужный контур std:: vector< CvSeq*> t_seq_longest;   for(int i = 0; i < t_source.size(); ++i) { t_contours_storage.push_back(cvCreateMemStorage(0)); t_seq_contours.push_back(NULL); t_seq_longest.push_back(NULL); t_gray.push_back(cvCreateImage(cvGetSize(t_source.at(i)), IPL_DEPTH_8U, 1)); t_edges.push_back(cvCreateImage(cvGetSize(t_source.at(i)), IPL_DEPTH_8U, 1)); //преобразуем шаблон в градации серого cvCvtColor(t_source.at(i), t_gray.at(i), CV_RGB2GRAY); //находим границы шаблона cvCanny(t_gray.at(i), t_edges.at(i), 500, 100, 3); //находим контуры шаблона int contoursContTemplate = cvFindContours(t_edges.at(i), t_contours_storage.at(i), & t_seq_contours.at(i), sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0)); //выделяем нужный контур - контур фигуры if(t_seq_contours.at(i)! = 0) { double template_perim = 0.0; for(CvSeq *t_seq_i = t_seq_contours.at(i); t_seq_i! = 0; t_seq_i = t_seq_i-> h_next) { //ищем самый длинный контур double perim = cvContourPerimeter(t_seq_i); if(template_perim < perim) { template_perim = perim; t_seq_longest.at(i) = t_seq_i; } } //рисуем самый длинный контур cvDrawContours(t_source.at(i), t_seq_longest.at(i), CV_RGB(255, 216, 0), CV_RGB(0, 0, 250), 0, 2, 8); } }   IplImage *frame_gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); IplImage *frame_edges = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); //преобразуем кадр в градации серого cvCvtColor(frame, frame_gray, CV_RGB2GRAY); //находим границы на кадре cvCanny(frame_gray, frame_edges, 500, 100, 3); //находим контуры на кадре int contoursContFrame = cvFindContours(frame_edges, frame_contours_storage, & frame_seq_contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0)); //для отметки контуров CvSeq *seq_best = NULL; int match_best = -1; //обходим контуры изображения if(frame_seq_contours! = 0) { for(CvSeq *frame_seq_i = frame_seq_contours; frame_seq_i! = 0; frame_seq_i = frame_seq_i-> h_next) { for(int j = 0; j < t_source.size(); ++j) { double match = cvMatchShapes(frame_seq_i, t_seq_longest.at(j), CV_CONTOURS_MATCH_I3); if(match > 0.9*k.at(j) & & match < 1.1*k.at(j)) { match_best = j; seq_best = frame_seq_i; } } } //рисуем контур лучшего совпадения cvDrawContours(frame, seq_best, CV_RGB(255, 216, 0), CV_RGB(0, 0, 250), 0, 2, 8); } return match_best; }

 


 

Приложение 3: содержание электронного носителя

1. Пояснительная записка;

2. Библиотека компьютерного зрения OpenCV;

3. Система автоматизации сборки ПО CMake;

4. Приложение для распознавания фигур;

5. Набор тестовых изображений.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.