Главная страница
Случайная страница
КАТЕГОРИИ:
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Приложение 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. Набор тестовых изображений.
|