Разработка программно-аппаратного комплекса для анализа видеоизображения и управления видеокамерой средствами языка C/C++ и библиотеки Open CV в среде разработки QT Creator
Искусственная нейронная сеть - математическая модель, представляющая собой систему соединённых, взаимодействующих между собой нейронов. Методы детектирования движения в видеопотоке. Обзор инструментальных средств для разработки программного продукта.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 06.06.2017 |
Размер файла | 2,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
}
cvCvtColor(frame,gray,CV_RGB2GRAY);
//Нашпримитивныйавтомат
switch(state)
{
casefind_object://Поисклица
while(detect_face(gray,cascade_frontal_face,MemStorage,face_rect)==false)
{
//cvShowImage("frame",frame);
//cvShowImage("points",gray);
if(cvWaitKey(33)>0)
break;
frame=cvQueryFrame(capture_web);
//gray=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U,1);
cvCvtColor(frame,gray,CV_RGB2GRAY);
}
init(gray,face_rect);
state=track_object;
break;
casetrack_object://Сопровождениелица
if(!object_tracking(gray,face_rect))
{
unsignedcharstop[]={0x83,0x01,0x06,0x01,0x00,0x00,0x03,0x03,0xFF};//8x010601VVWW0303FF
command.clear();
command.append((char*)stop,sizeof(stop));
send_command(command);
object_moving=false;//Лицопотеряно,деинициализируемданныесопровожденияименяемсостояние
qDebug()<<"lost"<<endl;
prev_mass_center.x=NULL;
prev_mass_center.y=NULL;
deinit();
state=find_object;
}
else
{
if(prev_mass_center.x!=NULL)
{
floatdelta_x=mass_center.x-prev_mass_center.x;
floatnext=mass_center.x;
//qDebug()<<"next-prev"<<delta_x<<endl;
if(object_moving==false)//есликамеранеподвижна
{
sum=delta_x+sum;
if((sum)>10)//объектдвижетсявлево
{
//if(window_center-next>0)//движетсяоткраякцентра
//break;//ничегонеделаем
if((window_center.x-next)<-30)//движетсяотцентраккраю
{
unsignedcharmove_right[]={0x83,0x01,0x06,0x01,0x03,0x00,0x02,0x03,0xFF};
command.clear();
command.append((char*)move_right,sizeof(move_right));
send_command(command);
//right();//камерусмещаемвправо
object_moving==true;
sum=0;
//qDebug()<<"next-prev"<<delta_x<<endl;
}
//qDebug()<<"next-prev"<<next-prev<<endl;
}
elseif((sum)<-10)//объектдвижетсявправо
{
if((window_center.x-next)>0)
{
unsignedcharmove_left[]={0x83,0x01,0x06,0x01,0x03,0x00,0x01,0x03,0xFF};
//8x010601VVWW0103FF
//QByteArraycommand;
command.clear();
command.append((char*)move_left,sizeof(move_left));
send_command(command);
//left();//камерусмещаемвлево
object_moving==true;
sum=0;
}
}
}
elseif(fabs(window_center.x-next)<50)//есликамераподвижна
{
unsignedcharstop[]={0x83,0x01,0x06,0x01,0x00,0x00,0x03,0x03,0xFF};//8x010601VVWW0303FF
command.clear();
command.append((char*)stop,sizeof(stop));
send_command(command);
object_moving==false;
qDebug()<<"rastoyaniedocentra"<<window_center.x-next<<endl;
}
}//moving(prev_mass_center.x,mass_center.x,window_center.x);
}
//}
break;
}
cvDrawRect(frame,cvPoint(face_rect.x,face_rect.y),cvPoint(face_rect.x+face_rect.width,face_rect.y+face_rect.height),cvScalar(255,0,0));
cvShowImage("frame",frame);
if(cvWaitKey(8)>0)
break;
}
cvReleaseCapture(&capture_web);
cvDestroyWindow("frame");
cvDestroyWindow("points");
cvClearMemStorage(MemStorage);
cvRelease((void**)&cascade_frontal_face);
port422->ClosePort();
port422->finished_Port();
//serial->close();
//my_thread->exit();
}
MainWindow::~MainWindow()
{
deleteui;
}
boolMainWindow::detect_face(IplImage*gray,CvHaarClassifierCascade*cascade,CvMemStorage*MemStorage,CvRect&face_rect)
{
cvClearMemStorage(MemStorage);
CvSeq*faces=cvHaarDetectObjects(gray,cascade,MemStorage,1.1,3,CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE
,cvSize(50,50));
////Поисклиц
if(!faces||!faces->total)
returnfalse;
//Возвращаемпервоенайденное
face_rect=*(CvRect*)cvGetSeqElem(faces,0);
returntrue;
//}
}
Файлmyport.cpp
#include"myport.h"
MyPort::MyPort(QObject*parent):
QObject(parent)
{
}
MyPort::~MyPort()
{
qDebug()<<"finish!!"<<endl;
emitfinished_Port();//Сигналозавершенииработы
}
voidMyPort::process_Port(){//Выполняетсяпристартекласса
qDebug()<<"Hello!"<<endl;
connect(&thisPort,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(handleError(QSerialPort::SerialPortError)));//подключаемпроверкуошибокпорта
connect(&thisPort,SIGNAL(readyRead()),this,SLOT(ReadInPort()));//подключаемчтениеспортапосигналуreadyRead()
}
voidMyPort::ConnectPort(void){//процедураподключения
thisPort.setPortName("COM6");
qDebug()<<"connecting.........."<<endl;
thisPort.setSettingsRestoredOnClose(false);
thisPort.open(QIODevice::ReadWrite);
thisPort.setBaudRate(QSerialPort::Baud9600);
thisPort.setDataBits(QSerialPort::Data8);//DataBits
thisPort.setParity(QSerialPort::NoParity);
thisPort.setStopBits(QSerialPort::OneStop);
thisPort.setFlowControl(QSerialPort::NoFlowControl);
//{
if(thisPort.isOpen()){
qDebug()<<"open"<<endl;
}else{
thisPort.close();
qDebug()<<"errortoopenport"<<endl;;
}
//object_moving=false;
//s=0;
//}else{
//thisPort.close();
//error_(thisPort.errorString().toLocal8Bit());
//}
}
voidMyPort::handleError(QSerialPort::SerialPortErrorerror)//проверкаошибокприработе
{
//if((thisPort.isOpen())&&(error==QSerialPort::ResourceError)){
//error_(thisPort.errorString().toLocal8Bit());
//DisconnectPort();
//}
}//
voidMyPort::ClosePort(){//Отключаемпорт
unsignedcharstop[]={camera_id,0x01,0x06,0x01,0x00,0x00,0x03,0x03,0xFF};//8x010601VVWW0303FF
QByteArraycommand;//command.clear();
command.append((char*)stop,sizeof(stop));
WriteToPort(command);
thisPort.waitForBytesWritten(200);
thisPort.close();
qDebug()<<"portclosed!!!"<<endl;;
//if(thisPort.isOpen()){
//thisPort.close();
//error_(SettingsPort.name.toLocal8Bit()+">>Закрыт!\r");
//}
}
voidMyPort::StopMoving()
{
unsignedcharstop[]={camera_id,0x01,0x06,0x01,0x00,0x00,0x03,0x03,0xFF};//8x010601VVWW0303FF
QByteArraycommand;//command.clear();
command.append((char*)stop,sizeof(stop));
WriteToPort(command);
}
voidMyPort::ReadInPort()
{
command_read.append(thisPort.readAll());
QByteArrayy=command_read.toHex();
command_read.clear();
qDebug()<<"answer"<<y<<endl;
}
voidMyPort::left()
{
unsignedcharmove_left[]={camera_id,0x01,0x06,0x01,0x03,0x00,0x01,0x03,0xFF};
//8x010601VVWW0103FF
QByteArraycommand;
command.append((char*)move_left,sizeof(move_left));
WriteToPort(command);
}
voidMyPort::right()
{
unsignedcharmove_right[]={camera_id,0x01,0x06,0x01,0x03,0x00,0x02,0x03,0xFF};
//command.clear();
QByteArraycommand;
command.append((char*)move_right,sizeof(move_right));
WriteToPort(command);
}
voidMyPort::WriteToPort(QByteArraydata){//Записьданныхвпорт
//if(thisPort.isOpen()){
//sleep(7);
thisPort.write(data);
qDebug()<<"commandiswritten"<<endl;
thisPort.waitForBytesWritten(200);
//}
}
Файлtracking.cpp
#include"mainwindow.h"
//слежениезалицом
boolMainWindow::object_tracking(IplImage*gray,CvRect&face_rect)
{
cvCopyImage(gray,current_img);
//ВычислениеновогоположенияточекспомощьюпирамидальногоалгоритмаанализаоптическогопотокаЛукаса-Канаде
cvCalcOpticalFlowPyrLK(prev_img,current_img,previous_pyramid,current_pyramid,
prev_points,current_points,count_point,cvSize(20,20),3,status,0,tc,flags);
flags|=CV_LKFLOW_PYR_A_READY;
if(count_point<30)
returnfalse;
//Удалениененайденныхточек,атакжевычислениекоординатописывающегопрямоугольника
floatleft=std::numeric_limits<float>::max();
floattop=std::numeric_limits<float>::max();
floatright=std::numeric_limits<float>::min();
floatbottom=std::numeric_limits<float>::min();
//Центрмасс
//CvPoint2D32fmass_center=cvPoint2D32f(0.f,0.f);
//CvPoint2D32fprev_mass_center=cvPoint2D32f(0.f,0.f);
prev_mass_center=mass_center;
intk=0;
for(inti=0;i<count_point;++i)
{
if(status[i])
{
current_points[k]=current_points[i];
if(current_points[k].x<left)
left=current_points[k].x;
if(current_points[k].x>right)
right=current_points[k].x;
if(current_points[k].y<top)
top=current_points[k].y;
if(current_points[k].y>bottom)
bottom=current_points[k].y;
mass_center.x+=current_points[k].x;
mass_center.y+=current_points[k].y;
++k;
}
}
count_point=k;
//MainWindowwind;
mass_center.x/=(float)count_point;
mass_center.y/=(float)count_point;
//mass_center_next=mass_center;
//Вычислениерасстоянияотцентрамасс,доближайшихсторонописывающегопрямоугольника
floatmin_x=std::min(mass_center.x-left,right-mass_center.x);
floatmin_y=std::min(mass_center.y-top,bottom-mass_center.y);
//Границыописывающегопрямоугольникапересчитываютсясучётомполученныхминимальныхзначений+небольшойотступнавсякийслучай
left=mass_center.x-min_x-min_x/4.f;
right=mass_center.x+min_x+min_x/4.f;
top=mass_center.y-min_y-min_y/4.f;
bottom=mass_center.y+min_y+min_y/4.f;
//Удалениеточек,которыенепопаливновый прямоугольник
k=0;
for(inti=0;i<count_point;++i)
{
if(current_points[i].x>left&&
current_points[i].x<right&&
current_points[i].y>top&&
current_points[i].y<bottom)
{
current_points[k]=current_points[i];
//Выводточек
cvDrawCircle(gray,cvPoint((int)current_points[k].x,(int)current_points[k].y),1,cvScalar(255,0,255));
++k;
}
}
count_point=k;
//printf("points_count=%i\n",count_point);//записываемсколькоточекнашлось
face_rect.x=(int)left;
face_rect.y=(int)top;
face_rect.width=(int)(right-left);
face_rect.height=(int)(bottom-top);
//Сменауказателейнапараметры
std::swap(prev_img,current_img);
std::swap(previous_pyramid,current_pyramid);
std::swap(prev_points,current_points);
cvShowImage("points",gray);
returntrue;
}
Заключение
В данной работе был разработан программно-аппаратный комплекс, который осуществляет анализ видеоизображения, путем поиска лица человека с помощью алгоритма Виолы-Джонса в режиме реального времени, а затем осуществляет слежение методом пирамидального оптического потока Лукаса-Канаде. В процессе слежения осуществляется движение видеокамеры в сторону движения объекта. Программа была написана на языке C/C++ в среде разработки QTCreatorс использованием библиотеки компьютерного зрения OpenCV.
Преимущества разработанной системы:
Работа в режиме реального времени.
Возможность обучить модель на поиск определенного объекта или определенного человека.
Устойчивость поиска при смене освещенности.
Устойчивость слежения при частичном перекрытии объекта (не более чем 50%).
Возможность работы с изображением низкого качества.
Недостатки:
Работа в двумерном пространстве без учета пространственной ориентации объекта.
Существенное время задержки получения изображения.
Неустойчивость алгоритма слежения к аффинным преобразованиям.
Рекомендации по улучшению работы программно-аппаратного комплекса:
Переход от двумерной системы координат к пространственной системе координат.
Работа одновременно с двумя и более камерами для создания 3D-модели объекта и распознавание при любой ориентации объекта в пространстве.
Улучшение работы алгоритма слежения за объектом путем учета аффинных преобразований.
Для повышения быстродействия и сокращения времени отклика программы рекомендуется распараллеливание вычислений алгоритмов.
Список литературы
1. Сойфер В.А. Компьютерная обработка изображений. Часть 2. Методы и алгоритмы. Соросовский образовательный журнал, №3, 1996, с. 110 - 121.
2. Р. Гонсалес, Р. Вудс, «Цифровая обработка изображений», изд-во: Техносфера, Москва, 2005. - 1072с.
3. Козлов В.Н., Функциональный анализ, Санкт-Петербург: СПбГПУ, 2012, 461с.
4. Тули М. Справочное пособие по цифровой электронике: Пер. с англ. -- М.: Энергоатомиздат, 1990.
5. Sony BRC H900 Command List
6. Sony BRC H900 Operating Manual
7. Bechtel W. The Cardinal Mercier Lectures at the Catholic University of Louvain: An Exemplar Neural Mechanism: The Brain's Visual Processing System. 2003
8. G. Yang and Thomas S. Huang. «Human face detection in a complex background. Pattern Recognition», 27(1):53-63, 1994
9. Татаренков Д. А. Анализ методов обнаружения лиц на изображении // Молодой ученый. -- 2015. -- №4. -- С. 270-276.
10. Lanitis, A.; Taylor, C.J.; Ahmed, T.; Cootes, T.F.; Wolfson «Image Anal. Classifying variable objects using a flexible shape model» Image Processing and its Applications, 1995., p.70-74.
11. Горбунов В.М. Теория принятия решений. Учебное пособие, Томск, 2010, с.67.
12. Прейко М., Устройства управления роботами: схемотехника и программирование - М.: Издательство ДМК, 2004, 202с.
Размещено на Allbest.ru
Подобные документы
Разработка программного обеспечения для автоматизированной системы калибровки и поверки комплекса технических средств ПАДК "Луг-1". Аналитический обзор аналогов. Проектирование пользовательского интерфейса. Средства разработки программного обеспечения.
дипломная работа [1,4 M], добавлен 17.12.2014Анализ существующего программно-аппаратного комплекса. Обоснование необходимости разработки интерактивного Интернет-сайта. Постановка комплекса задач разработки. Выбор инструментальных программных средств. Проектирование пользовательского интерфейса.
дипломная работа [2,0 M], добавлен 30.01.2017Требования к пользовательскому интерфейсу программного продукта. Выбор инструментальных средств разработки программы. Описание функциональной схемы, модульной структуры, структурной схемы. Технология разработки справочной системы программного продукта.
дипломная работа [2,7 M], добавлен 12.05.2016Выбор базовых программных средств для разработки оригинального программного обеспечения. Компоненты программно-методического комплекса проектирования токарных операций. Программное обеспечение для организации интерфейса программно-методического комплекса.
дипломная работа [2,8 M], добавлен 14.05.2010Особенности разработки и представления проекта программы, представляющей собой аналоговые часы с циферблатом, часовой, минутной и секундной стрелкой. Применение MS Visual Studio 2010, языка С++ для ее написания и компилирования. Специфика библиотеки MFC.
курсовая работа [440,2 K], добавлен 17.03.2014Выбор средства реализации программного продукта. Разработка программного комплекса (ПК). Руководство администратору и пользователю к нему. CMS Joomla - программа, включающая в себя различные инструменты для изготовления веб-сайта. Обработка ошибок в ПК.
курсовая работа [695,6 K], добавлен 19.06.2010Этапы разработки концептуальной модели и базовой архитектуры программно-аппаратного комплекса. Особенности процесса учета граждан города Черногорска. Модель SADT как серия диаграмм с сопроводительной документацией. Способы разработки интерфейса.
курсовая работа [3,7 M], добавлен 07.12.2012Обзор и анализ существующих методик управления проектами и оценки трудоемкости. Разработка алгоритма задания параметров и вычисления трудоемкости и стоимости программного продукта. Отладка и тестирование продукта. Разработка руководства пользователя.
дипломная работа [2,5 M], добавлен 18.11.2017Методы разработки автоматизированных систем. Характеристика языка программирования Delphi и операционной системы Windows. Назначение и область применение, принцип действия идентификаторов. Этапы разработки программного продукта, требования к нему.
курсовая работа [903,9 K], добавлен 14.02.2015Исследование существующих методов тестирования устройств телемеханики. Процесс разработки программы, анализ недостатков и достоинств создаваемой системы. Технологии разработки программных модулей и интерфейса пользователя, построение сетевого графика.
дипломная работа [2,3 M], добавлен 26.01.2013