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

После этапа разведки, начинается анализ данных. На этом этапе
находятся точки пересечения отрезков(на рисунке зеленые точки 1' и 2')
Когда все пересечения найдены можно приступать к использованию карты
например для того, что бы перейти из точки 4 в току 9 после применения
алгоритма нахождения кротчайшего пути, робот выберет путь 4-5-2'-9. Не
очень понятно объяснил но думаю вы поймете. Почему точка 2' может быть
использована? Потому что движение робота на отрезках 5-6 и 8-9 свободно
и проверенно. Этот пример похож чем то на железные дороги. Самое
сложное в реализации этого алгоритма это то, что робот всегда должен
точно знать где он находится, хотя это важно и для всех подобных
алгоритмов.
|
Для подключения сторонних библиотек в Microsoft Visual C++ необходимо:
1. Указать папку, где находятся библиотеки
Сервис->Пораметры->Проекты и решения->Каталоги VC++
В появившейся вкладке в выпадающем списке "Показать каталоги для"
выберите "Файлы библиотек". На экране появится список директорий, где
VC будет искать библиотеки. Добавьте в него вашу директорию или
директории.
2. Указать какие именно библиотеки надо включить в проект.
Проект->Свойства->Свойства конфигурации->Компоновщик->Ввод
Добавьте в "Дополнительные зависимости" только имена библиотек которые следует включить в проект.
3. Указать где находятся заголовочные файлы библиотек, т.е. указать
дополнительную директорию в которой VC будет искать файлы подключенные
директивой #include.
Сервис->Пораметры->Проекты и решения->Каталоги VC++
В появившейся вкладке в выпадающем списке "Показать каталоги для"
выберите "Включаемые файлы". На экране появится список директорий, где
VC будет искать файлы. Добавьте в него вашу директорию или директории.
|
|
Компьютерное зрение - это на сегодняшний день целая наука, занимающаяся
обработкой изображений, нахождением на них объектов, распознаванием
образов и многим другим. Она включает в себя элементы других наук таких
как математика, искусственный интеллект и д.р. Она сильно взаимосвязана
с ними, так как зрение и понимание увиденного - это сложный процесс.
На сегодняшний день существует много средств облегчающих разработку
программного обеспечения по этой теме. Одним из таких средств является
OpenCV. В этой библиотеке собрано большое количество методов для работы
с изображениями, и с видео. Скорость выполнения программ написаны с
помощью данной библиотеки очень велика, а так же скорость их
разработки. Не буду описывать все её особенности, о них можно узнать на
многочисленных ресурсах в интернете, просто скажу что я недавно начал с
ней работать и пока она мне очень нравится.
|
#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");
}
|
#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" );
}
|
IplImage* img = cvLoadImage("image.jpg");
for( int y=0; y height; 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;
}
}
}
|
Алгоритм закрашивания очень часто используется в компьютерной графике для закрашивания фигур имеющих границы. Так же этот алгоритм может иметь и другое применение например его можно использовать для нахождения центра масс тела по его изображению. Приведу два алгоритма один рекурсивный, а второй линейный. Рекурсивный имеет один недостаток, его нельзя использовать для закрашивания больших фигур так как при большом количестве элементов происходит переполнение стека. Код использует 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;
}
|
|
|
 |
|  |
|
| Форма входа |
|
 |
| Поиск |
|
|
 |
| Друзья сайта |
|
 |
|