Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опис_КомпНауки.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
4 Мб
Скачать
☆

Зображення 9 - Вибір типів калібрування та комп'ютера

  1. Інструкція з калібрування змінюється в залежності від обраного типу калібрування (Зображення 10).

Зображення 10 - Інструкція з калібрування

  1. Калібруємо поверхню. Відкалібровані кути позначаються червоним колом (Зображення 11).

Зображення 11 - Три відкалібровані кути

  1. Процес налаштування закінчено. Тепер можна користуватися запропонованими функціями. Нові можливості постійно додаються, а старі – модифікуються.

Висновки

Експериментальна частина тривала протягом 2013-2014 року , представляла собою практичні дії, направлені на вибір найкращого варіанта для розпізнавання необхідних даних взаємодії користувача з інтерактивною поверхнею:

  • Використання двох веб-камер та використання однієї веб-камери;

  • Вибір та реалізацію алгоритму для розпізнавання даних;

  • Створення моделі, для визначення положення пальців;

  • Реалізація функції у вигляді багатокористувацької графічної дошки.

  • Створення системи управління комп'ютером за допомогою інтерактивної взаємодії.

Проект може бути корисним для проведення інтерактивних презентацій та уроків у навчальних закладах; використання в комп’ютерних іграх; створення ПЗ з інтерактивною взаємодією; створення рекламних банерів, які можуть взаємодіяти з прохожими; та багато інших сфер застосування.

Також, цей комплекс можна використовувати там, де потрібна інтерактивна взаємодія або там, де зараз використовується мультимедійна дошка.

Отже, проект моє велику сферу використання та низьку ціну, на відміну від аналогів, приблизно у 15 разів менше. Собівартість такого комплекту приблизно 200-250 грн.

Список літератури та джерел інформації

  1. T.Duff Interval arithmetic and recursive, subdivision for implicit functions and constructive solid geometry, Computer Graphics, 26(2), 131-138

  2. 12. A.Ricci A constructive geometry for computer graphics, The Computer Journal, 16(2), 157-160

  3. I.C.Braid Geometric modelling // Advances in Computer Graphics.-Berlin: Springer-Verlag, 1981.-P. 425-462.

  4. Научная библиотека диссертаций и авторефератов disserCat. [Електронний ресурс]- Доступ до джерела:- http://www.dissercat.com/content/proektirovanie-poverkhnostei-svobodnoi-formy-na-osnove-interaktivnogo-zadaniya-formoobrazuyu#ixzz2ILNUMPUq

  5. Документація OpenCV [Електронний ресурс] - Доступ до джерела:- http://locv.ru/

  6. Распознавание образов для программистов [Електронний ресурс]- Доступ до джерела:- http://blog.vidikon.com/?cat=1

  7. Бібліотека комп’ютерного зору [Електронний ресурс ] Доступ до джерела:- / http://opencv.org/

  8. Понарин Я.П. Алгебра комплексных чисел в геометрических задачах: Книга для учащихся математических классов школ, учителей и студентов педагогических вузов. – М.: МЦНМО, 2004

  9. Яглом И.М., Ашкинузе В.Г. Идеи и методы аффинной и проективной геометрии. Часть 1. Аффинная геометрия. М.: - Учпедгиз, 1962

Додаток а

Демонстрація роботи проекту

Додаток б

Фрагмент похідного коду

#include "stdafx.h"

#include <cv.h>

#include <highgui.h>

#include <cvaux.h>

#include <ctype.h>

#include <stdlib.h>

#include <stdio.h>

#include <opencv2/opencv.hpp>

#include <windows.h>

#include <ctime>

#include <time.h>

#pragma comment(lib, "user32.lib")

#ifdef _MSC_VER

# if CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION == 3 && CV_SUBMINOR_VERSION == 1

# if defined(_DEBUG)

# pragma comment(lib, "opencv_core231d.lib")

# pragma comment(lib, "opencv_highgui231d.lib")

# pragma comment(lib, "opencv_imgproc231d.lib")

# pragma comment(lib, "opencv_video231d.lib")

# pragma comment(lib, "opencv_ml231d.lib")

# pragma comment(lib, "opencv_calib3d231d.lib")

# pragma comment(lib, "opencv_objdetect231d.lib")

# pragma comment(lib, "opencv_features2d231d.lib")

# pragma comment(lib, "opencv_contrib231d.lib")

# pragma comment(lib, "opencv_ts231d.lib")

# pragma comment(lib, "opencv_legacy231d.lib")

# pragma comment(lib, "opencv_flann231d.lib")

# pragma comment(lib, "opencv_gpu231d.lib")

# else

# pragma comment(lib, "opencv_core231.lib")

# pragma comment(lib, "opencv_highgui231.lib")

# pragma comment(lib, "opencv_imgproc231.lib")

# pragma comment(lib, "opencv_video231.lib")

# pragma comment(lib, "opencv_ml231.lib")

# pragma comment(lib, "opencv_calib3d231.lib")

# pragma comment(lib, "opencv_objdetect231.lib")

# pragma comment(lib, "opencv_features2d231.lib")

# pragma comment(lib, "opencv_contrib231.lib")

# pragma comment(lib, "opencv_ts231.lib")

# pragma comment(lib, "opencv_legacy231.lib")

# pragma comment(lib, "opencv_flann231.lib")

# pragma comment(lib, "opencv_gpu231.lib")

# endif

#endif

#endif

#pragma comment(lib, "videoInput/videoInput.lib")

#include "videoInput/include/videoInput.h"

__time64_t timer1;

__time64_t timer2;

__time64_t timer3;

void Counter(IplImage* img, int Max, int Min);

CvPoint2D32f center;

float radius;

long pointer=0;

int Hmin = 0;

int Hmax = 256;

int Smin = 0;

int Smax = 256;

int Vmin = 0;

int Vmax = 256;

int HSVmax = 256;

int SizeMin = 0;

int SizeMax = 256;

IplImage* image=0;

IplImage* dst = 0;

// для хранения каналов HSV

IplImage* hsv = 0;

IplImage* h_plane = 0;

IplImage* s_plane = 0;

IplImage* v_plane = 0;

// для хранения каналов HSV после преобразования

IplImage* h_range = 0;

IplImage* s_range = 0;

IplImage* v_range = 0;

// для хранения суммарной картинки

IplImage* hsv_and = 0;

float screenW,screenH,EK,KG,Xm,Xn;

CvPoint mouse_point[50];

int area_x[4];

int area_y[4];

int areaN=0;

int staysec=0;

BOOLEAN yesfirst=true;

BOOLEAN ispen;

void myMouseCallback( int event, int x, int y, int flags, void* param )

{

switch( event ){

case CV_EVENT_MOUSEMOVE:

break;

case CV_EVENT_LBUTTONDOWN:

if(areaN<=3){

area_x[areaN]=x;

area_y[areaN]=y;

areaN++;

printf("%d x %d\n", x, y);

}

break;

case CV_EVENT_LBUTTONUP:

break;

}

}

int main(int argc, char* argv[])

{

areaN=0;

ispen=true;

FILE * fo;

fo = fopen("CamTouch.config","r");

fscanf( fo, "%d", &Hmin );

fscanf( fo, "%d", &Hmax );

fscanf( fo, "%d", &Smin );

fscanf( fo, "%d", &Smax );

fscanf( fo, "%d", &Vmin );

fscanf( fo, "%d", &Vmax );

fscanf( fo, "%d", &SizeMin );

fscanf( fo, "%d", &SizeMax );

fclose(fo);

videoInput VI;

int numDevices = VI.listDevices();

int device1=0;

VI.setIdealFramerate(device1, 20);

VI.setupDevice(device1, 620, 480,VI_COMPOSITE);

image = cvCreateImage(cvSize(VI.getWidth(device1),VI.getHeight(device1)), IPL_DEPTH_8U, 3);

VI.getPixels(device1, (unsigned char *)image->imageData, false, true);

hsv = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 3 );

h_plane = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 );

s_plane = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 );

v_plane = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 );

h_range = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 );

s_range = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 );

v_range = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 );

hsv_and = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U, 1 );

cvNamedWindow("original",CV_WINDOW_AUTOSIZE);

cvSetMouseCallback( "original", myMouseCallback, (void*) image);

while(areaN<=3)

{

if (VI.isFrameNew(device1))

{

VI.getPixels(device1, (unsigned char *)image->imageData, false, true);

cvSmooth(image, image,CV_GAUSSIAN,5);

cvCvtColor( image, hsv, CV_BGR2HSV );

cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

cvInRangeS(h_plane, cvScalar(Hmin), cvScalar(Hmax), h_range);

cvInRangeS(s_plane, cvScalar(Smin), cvScalar(Smax), s_range);

cvInRangeS(v_plane, cvScalar(Vmin), cvScalar(Vmax), v_range);

cvZero(hsv_and);

cvAnd(h_range, s_range, hsv_and);

cvAnd(hsv_and, v_range, hsv_and);

cvShowImage( "hsv and", hsv_and );

Counter( hsv_and,SizeMax,SizeMin);

cvDestroyAllWindows();

for (int i=0;i<=3;i++)

for (int j=0;j<=3;j++)

{

if (area_y[i]>area_y[j]) {area_y[i]=area_y[i]+area_y[j]; area_y[j]=area_y[i]-area_y[j];

area_y[i]=area_y[i]-area_y[j];};

}

screenW = GetSystemMetrics(SM_CXSCREEN);

screenH = GetSystemMetrics(SM_CYSCREEN);

printf("W %d H %d\n", (int)screenW,(int)screenH);

screenH=(float)screenH/(area_y[0]-area_y[3]);

Sleep(3000);

while(true)

{

if (VI.isFrameNew(device1))

{

VI.getPixels(device1, (unsigned char *)image->imageData, false, true);

}

cvSmooth(image, image,CV_GAUSSIAN,5);

cvCvtColor( image, hsv, CV_BGR2HSV );

cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

cvInRangeS(h_plane, cvScalar(Hmin), cvScalar(Hmax), h_range);

cvInRangeS(s_plane, cvScalar(Smin), cvScalar(Smax), s_range);

cvInRangeS(v_plane, cvScalar(Vmin), cvScalar(Vmax), v_range);

cvZero(hsv_and);

cvAnd(h_range, s_range, hsv_and);

cvAnd(hsv_and, v_range, hsv_and);

Counter( hsv_and, SizeMax,SizeMin);

if ((center.y>=area_y[3] && center.y<=area_y[0]) || (center.y<=area_y[3] && center.y>=area_y[0]))

{

CvPoint p;

p.x=center.x;

p.y=center.y;

EK=p.y-area_y[3];

KG=area_y[0]-p.y;

EK=EK/KG;

Xm=(area_x[0]+EK*area_x[3])/(1+EK);

Xn=(area_x[1]+EK*area_x[2])/(1+EK);

EK=Xn-Xm;

p.x=center.x-Xm;

p.y=center.y-area_y[3];

Xm=(float)screenW/EK;

Xm=(float)p.x*Xm;

printf("X %d Y %d\n", (int)p.x,(int)p.y);

if (ispen){

SetCursorPos(ceil((float)p.x*((float)screenW/EK)),ceil(p.y*screenH));

}

if ((yesfirst==true) && (ispen==true)){

mouse_event(MOUSEEVENTF_LEFTDOWN,ceil((float)p.x*((float)screenW/EK)), ceil(p.y*screenH), 0, 0);

yesfirst=false;

}

if ((yesfirst==false) && (ispen==false)){

mouse_event(MOUSEEVENTF_LEFTUP,ceil((float)p.x*((float)screenW/EK)), ceil(p.y*screenH), 0, 0);

yesfirst=true;

}

}

}

cvReleaseImage(&hsv);

cvReleaseImage(&h_plane);

cvReleaseImage(&s_plane);

cvReleaseImage(&v_plane);

cvReleaseImage(&h_range);

cvReleaseImage(&s_range);

cvReleaseImage(&v_range);

cvReleaseImage(&hsv_and);

VI.stopDevice(device1);

return 0;

}

void Counter(IplImage* img,int max,int min)

{

IplImage* img_gray= cvCreateImage( cvGetSize(img), 8, 1);

CvSeq* contours = 0;

CvMemStorage* storage = cvCreateMemStorage(0);

cvFindContours( img, storage, &contours, sizeof(CvContour),

CV_RETR_LIST , CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );

CvSeq* h_next=0;

CvSeq* pencil=0;

for( CvSeq* c=contours; c!=NULL; c=c->h_next )

{

if (c!=contours)

{

cvMinEnclosingCircle(h_next,&center,&radius);

if (radius>min & radius<max ) {

pencil=h_next;}

}

h_next=c;

}

center.x=-1;

if (pencil!=0)

{

cvDrawContours( img, pencil, CV_RGB(255,0,0), CV_RGB(255,0,0),2, 2, CV_AA, cvPoint(0,0) );

cvMinEnclosingCircle(pencil,&center,&radius);

ispen=true;

} else {

ispen=false;

}cvReleaseMemStorage( &storage);

cvReleaseImage( &img_gray );

}

19