Понедельник, 13.05.2024, 22:46
Нереальное реально
Приветствую Вас Гость | RSS
Главная страница | Регистрация | Вход
Меню сайта



Не знаю можно или нет отнести этот алгоритм построения карты роботом к векторному. Суть его заключается в том, что робот двигается по полигону прямыми отрезками встречая препятствие от останавливается тем самым завершая отрезок, разворачивается на какой либо угол и начинает вновь свое движение до следующего препятствия. Таким способом он покрывает отрезками всю территорию полигона.
Это видно на рисунки(голубые отрезки и красные точки 1-14)

map

После этапа разведки, начинается анализ данных. На этом этапе находятся точки пересечения отрезков(на рисунке зеленые точки 1' и 2') Когда все пересечения найдены можно приступать к использованию карты например для того, что бы перейти из точки 4 в току 9 после применения алгоритма нахождения кротчайшего пути, робот выберет путь 4-5-2'-9. Не очень понятно объяснил но думаю вы поймете. Почему точка 2' может быть использована? Потому что движение робота на отрезках 5-6 и 8-9 свободно и проверенно. Этот пример похож чем то на железные дороги. Самое сложное в реализации этого алгоритма это то, что робот всегда должен точно знать где он находится, хотя это важно и для всех подобных алгоритмов.

Просмотров: 409 | Добавил: Milk3D | Дата: 20.08.2009 | Комментарии (0)

Для подключения сторонних библиотек в Microsoft Visual C++ необходимо:
1. Указать папку, где находятся библиотеки
Сервис->Пораметры->Проекты и решения->Каталоги VC++
В появившейся вкладке в выпадающем списке "Показать каталоги для" выберите "Файлы библиотек". На экране появится список директорий, где VC будет искать библиотеки. Добавьте в него вашу директорию или директории.

2. Указать какие именно библиотеки надо включить в проект.
Проект->Свойства->Свойства конфигурации->Компоновщик->Ввод
Добавьте в "Дополнительные зависимости" только имена библиотек которые следует включить в проект.

3. Указать где находятся заголовочные файлы библиотек, т.е. указать дополнительную директорию в которой VC будет искать файлы подключенные директивой #include.
Сервис->Пораметры->Проекты и решения->Каталоги VC++
В появившейся вкладке в выпадающем списке "Показать каталоги для" выберите "Включаемые файлы". На экране появится список директорий, где VC будет искать файлы. Добавьте в него вашу директорию или директории.

Просмотров: 453 | Добавил: Milk3D | Дата: 20.08.2009 | Комментарии (0)

Компьютерное зрение - это на сегодняшний день целая наука, занимающаяся обработкой изображений, нахождением на них объектов, распознаванием образов и многим другим. Она включает в себя элементы других наук таких как математика, искусственный интеллект и д.р. Она сильно взаимосвязана с ними, так как зрение и понимание увиденного - это сложный процесс.
На сегодняшний день существует много средств облегчающих разработку программного обеспечения по этой теме. Одним из таких средств является OpenCV. В этой библиотеке собрано большое количество методов для работы с изображениями, и с видео. Скорость выполнения программ написаны с помощью данной библиотеки очень велика, а так же скорость их разработки. Не буду описывать все её особенности, о них можно узнать на многочисленных ресурсах в интернете, просто скажу что я недавно начал с ней работать и пока она мне очень нравится.
Просмотров: 421 | Добавил: Milk3D | Дата: 20.08.2009 | Комментарии (0)

#include "highgui.h"
int main(int argc, char* argv[])
{
IplImage* img = cvLoadImage("Image.bmp");
cvNamedWindow( "sims.bmp", CV_WINDOW_AUTOSIZE );
cvShowImage( "sims.bmp", img );
cvWaitKey(0);
cvReleaseImage( &img );
cvDestroyWindow("Example1");
}
Просмотров: 427 | Добавил: Milk3D | Дата: 20.08.2009 | Комментарии (0)

#include "highgui.h"
int main(int argc, char* argv[])
{
cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE );
CvCapture* capture = cvCreateCameraCapture(0);
int width = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
int height = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
IplImage* frame;
while(1){
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "Example2", frame );
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "Example2" );
}
Просмотров: 510 | Добавил: Milk3D | Дата: 20.08.2009 | Комментарии (0)

IplImage* img = cvLoadImage("image.jpg");
for( int y=0; yheight; y++ ) {
uchar* ptr = (uchar*)(img->imageData + y * img->widthStep);
for( int x=0; xwidth; x++ ) {
if(ptr[3*x]+20>=ptr[3*x+1]||ptr[3*x+2]+20>=ptr[3*x+1]){
ptr[3*x] = 0;
ptr[3*x+1] = 0;
ptr[3*x+2] = 0;
}
}
}
Просмотров: 470 | Добавил: Milk3D | Дата: 20.08.2009 | Комментарии (0)

Алгоритм закрашивания очень часто используется в компьютерной графике для закрашивания фигур имеющих границы. Так же этот алгоритм может иметь и другое применение например его можно использовать для нахождения центра масс тела по его изображению. Приведу два алгоритма один рекурсивный, а второй линейный. Рекурсивный имеет один недостаток, его нельзя использовать для закрашивания больших фигур так как при большом количестве элементов происходит переполнение стека. Код использует OpenCV для работы с изображениями, но при желании их можно переписать под что угодно.

1. Рекурсивный алгоритм


void zakrashivanie(uchar** ptr,int x, int y){

if(ptr[y][3*x]==255){
//Закраска (x, y) пикселя
ptr[y][3*x] = 0;
ptr[y][3*x+1] = 255;
ptr[y][3*x+2] = 0;
zakrashivanie(ptr,x-1,y);
zakrashivanie(ptr,x+1,y);
zakrashivanie(ptr,x,y-1);
zakrashivanie(ptr,x,y+1);
}

}

2. Волновой алгоритм


void NearPix(uchar** ptr,int x, int y, int *numStack, CvPoint *Stack){

if(ptr[y][3*x]==255){
ptr[y][3*x] = 0;
ptr[y][3*x+1] = 255;
ptr[y][3*x+2] = 0;
Stack[*numStack].x=x;
Stack[*numStack].y=y;
(*numStack)++;
}

}

void OneStep(uchar** ptr, int *numSrc, int *numDest, CvPoint *Src, CvPoint *Dest){

int x,y,i;
*numDest=0;
for(i=0; i<*numSrc;i++){
x=Src[i].x;
y=Src[i].y;
NearPix(ptr,x+1,y,numDest,Dest);
NearPix(ptr,x-1,y,numDest,Dest);
NearPix(ptr,x,y+1,numDest,Dest);
NearPix(ptr,x,y-1,numDest,Dest);
}

}

void WaveFill(uchar** ptr,int xst, int yst){

int numA, numB;
CvPoint *stackA, *stackB;
stackA=new CvPoint[10000];
stackB=new CvPoint[10000];
numA=1;
stackA[0].x=xst;
stackA[0].y=yst;
numB=0;
while(1){
if(numA>0)OneStep(ptr,&numA,&numB,stackA,stackB);
else break;
if(numB>0)OneStep(ptr,&numB,&numA,stackB,stackA);
else break;
}
delete [] stackB;
delete [] stackA;

}

Просмотров: 461 | Добавил: Milk3D | Дата: 20.08.2009 | Комментарии (0)



Форма входа

Поиск

Друзья сайта

Статистика

Copyright MyCorp © 2024 Хостинг от uCoz