Разработка программно-аппаратного комплекса для анализа видеоизображения и управления видеокамерой средствами языка 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


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.