Перейти к содержимому
Compvision.ru

stanley_goodspeed

Пользователи
  • Количество публикаций

    7
  • Зарегистрирован

  • Посещение

Все публикации пользователя stanley_goodspeed

  1. Работа с контурами

    Спасибо большое! А тот способ которым я пользовался он вообще правильный?
  2. Работа с контурами

    Попробовал таким образом: CvPoint* pt; std::cout<<seqM->total<<std::endl; for(int i=0; i<seqM->total;i++){ CvPoint* point = reinterpret_cast<CvPoint*>(cvGetSeqElem(seqM, i)); //std::cout<<point->x; printf("x = %d y = %d\n ",point->x, point->y); } Но непонятно те ли это точки вообще?
  3. Работа с контурами

    Здравствуйте, подскажите пожалуйста, как можно извлечь точки из контура. Контур найден таким образом: cvFindContours( binI, storage, &contoursI, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); Далее я пробегаю по всем контурам и нахожу самый похожий на свой заданный контур: CvSeq* seqM=0; double matchMax=1000; // обходим контуры изображения counter=0; i=0; float rad; CvPoint2D32f point; if(contoursI!=0){ // поиск лучшего совпадения контуров по их моментам for(CvSeq* seq0 = contoursI;seq0!=0;seq0 = seq0->h_next){ double match0 = cvMatchShapes(seq0, seqT, 3); if(match0<matchMax){ matchMax = match0; seqM = seq0; } cvMinEnclosingCircle(seq0,&point,&rad); // получим окружность содержащую контур } } Теперь я хочу пробежаться по всем точкам своего найденного контура. Что то типа: CvPoint* pt; for(int i=0; i<seqM->total;i++){ pt=seqM->Point; } Подскажите пожалуйста, как это можно сделать
  4. Здравствуйте, я только начал изучать OpenCV и передо мной стоит такая задача: нужно на изображении распознать геометрические формы, т.е.: прямоугольник, окружность, треугольник, стрелка и т.д., затем найти параметры этих фигур(радиус, длина, координаты и т.д.) и записать это всё в XML. Хотел бы узнать с чего мне стоит начать, про какие алгоритмы почитать, может быть есть какие нибудь готовые шаблоны, которые можно было бы доработать, подскажите пожалуйста. Спасибо.
  5. Распознавание геометрических форм

    Мне нужно измерить параметры стандартных фигур, например окружность, прямоугольник. Для окружности это :радиус, координаты центра. А для прямоугольника ширина и высота, координаты угла.
  6. Распознавание геометрических форм

    Здравствуйте! Разбираюсь с этой задачей и изучил примеры которые вы прислали, в итоге получается определить фигуру по заданному исходному контуру(но с плохой точностью). Использовал функцию cvMatchShapes, которая сравнивает фигуры по их моментам. Но как определить параметры фигуры (например радиусы, длины, положение на картинке) непонятно.. подскажите пожалуйста. Скриншот программы в прикреплённых файлах. #include <cv.h> #include <highgui.h> #include <stdlib.h> #include <stdio.h> // сравнение объектов по моментам их контуров void testMatch(IplImage* original, IplImage* templ) { assert(original!=0); assert(templ!=0); printf("[i] test cvMatchShapes()\n"); IplImage* src=0; IplImage* dst=0; src=cvCloneImage(original); IplImage* binI = cvCreateImage( cvGetSize(original), 8, 1); IplImage* binT = cvCreateImage( cvGetSize(templ), 8, 1); printf("No problem!"); // заведём цветные картинки IplImage* rgb = cvCreateImage(cvGetSize(original), 8, 3); cvConvertImage(src, rgb, CV_GRAY2BGR); IplImage* rgbT = cvCreateImage(cvGetSize(templ), 8, 3); cvConvertImage(templ, rgbT, CV_GRAY2BGR); // получаем границы изображения и шаблона cvCanny(src, binI, 50, 200); cvCanny(templ, binT, 50, 200); // показываем //cvNamedWindow( "cannyI", 1 ); //cvShowImage( "cannyI", binI); //cvNamedWindow( "cannyT", 1 ); //cvShowImage( "cannyT", binT); // для хранения контуров CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contoursI=0, *contoursT=0; // находим контуры изображения int contoursCont = cvFindContours( binI, storage, &contoursI, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); // для отметки контуров CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.0, 1.0); char buf[128]; int counter=0; int i = 0; // нарисуем контуры изображения if(contoursI!=0){ for(CvSeq* seq0 = contoursI;seq0!=0;seq0 = seq0->h_next){ // рисуем контур cvDrawContours(rgb, seq0, CV_RGB(255,216,0), CV_RGB(0,0,250), 0, 1, 8); // выводим его номер i+=10; float rad;CvPoint2D32f point; cvMinEnclosingCircle(seq0,&point,&rad); // получим окружность содержащую контур point.x = point.x + i; cvPutText(rgb, itoa(++counter, buf, 10), cvPointFrom32f(point), &font, CV_RGB(0,255,0)); } } // показываем cvNamedWindow( "cont", 1 ); cvShowImage( "cont", rgb ); cvConvertImage(src, rgb, CV_GRAY2BGR); // находим контуры шаблона cvFindContours( binT, storage, &contoursT, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); CvSeq* seqT=0; double perimT = 0; if(contoursT!=0){ // находим самый длинный контур for(CvSeq* seq0 = contoursT;seq0!=0;seq0 = seq0->h_next){ double perim = cvContourPerimeter(seq0); if(perim>perimT){ perimT = perim; seqT = seq0; } // рисуем cvDrawContours(rgbT, seq0, CV_RGB(255,216,0), CV_RGB(0,0,250), 0, 1, 8); // рисуем контур } } // покажем контур шаблона cvDrawContours(rgbT, seqT, CV_RGB(52,201,36), CV_RGB(36,201,197), 0, 2, 8); // рисуем контур cvNamedWindow( "contT", 1 ); cvShowImage( "contT", rgbT ); CvSeq* seqM=0; double matchM=1000; // обходим контуры изображения counter=0; i=0; float rad;CvPoint2D32f point; if(contoursI!=0){ // поиск лучшего совпадения контуров по их моментам for(CvSeq* seq0 = contoursI;seq0!=0;seq0 = seq0->h_next){ double match0 = cvMatchShapes(seq0, seqT, CV_CONTOURS_MATCH_I3); if(match0<matchM){ matchM = match0; seqM = seq0; } //cvMinEnclosingCircle(seq0,&point,&rad); // получим окружность содержащую контур //point.x = point.x + i; //point.y = point.y + 10; // cvPutText(rgb, itoa(++counter, buf, 10), cvPointFrom32f(point), &font, CV_RGB(0,255,0)); printf("[i] %d match: %.2f\n", ++counter, match0); } } // рисуем найденный контур cvDrawContours(rgb, seqM, CV_RGB(52,201,36), CV_RGB(36,201,197), 0, 2, 8); // рисуем контур cvNamedWindow( "find", 1 ); cvShowImage( "find", rgb ); // ждём нажатия клавиши cvWaitKey(0); // освобождаем ресурсы cvReleaseMemStorage(&storage); cvReleaseImage(&src); cvReleaseImage(&dst); cvReleaseImage(&rgb); cvReleaseImage(&rgbT); cvReleaseImage(&binI); cvReleaseImage(&binT); // удаляем окна cvDestroyAllWindows(); } int main(int argc, char* argv[]) { IplImage *original=0, *templ=0; // имя картинки задаётся первым параметром char* filename = argc >= 2 ? argv[1] : "D:\\work\\DiplomApplication2\\DiplomApplication2\\kontur6.png"; // получаем картинку original = cvLoadImage(filename, 0); printf("[i] image: %s\n", filename); assert( original != 0 ); // имя шаблона задаётся вторым параметром char* filename2 = argc >= 3 ? argv[2] : "D:\\work\\DiplomApplication2\\DiplomApplication2\\kontur0.png"; // получаем картинку templ = cvLoadImage(filename2, 0); printf("[i] template: %s\n", filename2); assert( templ != 0 ); /*покажем изображения*/ /*cvNamedWindow( "original", 1 ); cvShowImage( "original", original ); cvNamedWindow( "template", 1 ); cvShowImage( "template", templ );*/ // сравнение testMatch(original, templ); // освобождаем ресурсы cvReleaseImage(&original); cvReleaseImage(&templ); // удаляем окна cvDestroyAllWindows(); return 0; }
  7. Распознавание геометрических форм

    Спасибо! Буду разбираться
×