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

tii20

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

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

  • Посещение

Репутация

0 Новичек

О tii20

  • Звание
    Бывалый
  1. cvFindContours+RIO

    Затупил. Не там цикл закрыл)) и с рамкой пришлось size окна подгонять под RIO. Может кому то пригодится тема)
  2. cvFindContours+RIO

    В принципе я понял почему рамку рисует, потому что, когда RIO вытягивается, картинка в нем одного размера, а окно для отображения другого, и часть окна в сером. Думаю если убрать заработает. И собственно вопрос) тогда в другом, как подогнать размер окна под RIO? cvNamedWindow("V range",CV_WINDOW_AUTOSIZE); в
  3. cvFindContours+RIO

    Всем привет! У меня такой вопрос, достаточно тривиальный, но мне не поддается. Идея в чем, есть изображение, достаю из него RIO, перевожу в hsv ищу контуры и рисую их на главном изображении.Параметры RIO задаю мышкой. Все работает,но 1. проблема как можно в int contoursCont = cvFindContours( s_range, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(160,72)); передать координаты как параметры, которые выше задаются мышкой, cvPoint(160,72). 2. когда рисуются контуры на главном изображении почему то, идет захват и рамки RIO, а не конкретного объекта. Т.е. рисуются контуры объекта и RIO. Возможно это из-за того, что параметры функции cvDrawContours и cvFindContours сырые и их надо подкрутить. Внизу мой код, писал его быстро только для того, чтобы проверить будет ли работать эта система(сделаю из него красавчика если заработает)))). Пожалуйста подскажите может у кто нибудь воевал с RIO и cvFindContours на форуме поиск не помог(. Заранее спасибо! #include <cv.h> #include <highgui.h> #include <stdlib.h> #include <stdio.h> IplImage* image = 0; IplImage* src = 0; IplImage* rio_copy= 0; IplImage* h_plane = 0; IplImage* s_plane = 0; IplImage* v_plane = 0; IplImage* h_range = 0; IplImage* s_range = 0; IplImage* v_range = 0; IplImage* hsv = 0; IplImage* rio_copy_hsv=0; // рисуем целеуказатель void drawTarget(IplImage* img, int x, int y, int radius) { cvRectangle(img,cvPoint(x,y),cvPoint(x,y), cvScalar(255,255,255)); FILE *out; out=fopen("XandY.dat","w"); fprintf(out,"%i %i ", x, y); fclose(out); } // обработчик событий от мышки void myMouseCallback( int event, int x, int y, int flags, void* param ) { IplImage* img = (IplImage*) param; switch( event ){ case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: printf("%d x %d\n", x, y); drawTarget(img, x, y, 10); break; case CV_EVENT_LBUTTONUP: break; } } int main(int argc, char* argv[]) { // имя картинки задаётся первым параметром char* filename = argc == 2 ? argv[1] : "22.jpg"; // получаем картинку image = cvLoadImage(filename,1); // клонируем картинку src = cvCloneImage(image); rio_copy = cvCreateImage( cvGetSize(image), IPL_DEPTH_8U,3); cvNamedWindow("ROI", CV_WINDOW_AUTOSIZE); cvNamedWindow("ROI_copy", CV_WINDOW_AUTOSIZE); cvCopyImage(image, rio_copy); printf(" image: %s\n", filename); assert( src != 0 ); // окно для отображения картинки cvNamedWindow("original",CV_WINDOW_AUTOSIZE); // вешаем обработчик мышки cvSetMouseCallback( "original", myMouseCallback, (void*) image); while(1){ char key = cvWaitKey(0); // показываем картинку cvCopyImage( image, src ); switch(key) { case 's': FILE *in; int m,n; if ((in=fopen("XandY.dat","r"))!=NULL) { fscanf(in,"%d %d", &m, &n); printf("NEW=%i\n", m); printf("NEW=%i\n", n); } m=m-10; n=n-10; int p=m; int k=n; // задаём ROI int x = argc >= 3 ? atoi(argv[2]) : m; int y = argc >= 4 ? atoi(argv[3]) : n; int width = argc >= 5 ? atoi(argv[4]) : 50; int height = argc >= 6 ? atoi(argv[5]) : 50; // добавочная величина //12 73 200 //11 83 188 // cvShowImage( "origianl", image); // устанавливаем ROI cvSetImageROI(rio_copy, cvRect(x,y,width,height)); rio_copy_hsv = cvCreateImage( cvGetSize(rio_copy), IPL_DEPTH_8U, 3 ); cvCopyImage(rio_copy, rio_copy_hsv); cvDestroyWindow("ROI"); // cvDestroyWindow("ROI_copy"); hsv = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 3 ); h_range = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 ); s_range = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 ); v_range = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 ); h_plane = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 ); s_plane = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 ); v_plane = cvCreateImage( cvGetSize(rio_copy_hsv), IPL_DEPTH_8U, 1 ); cvCvtColor( rio_copy_hsv, hsv, CV_BGR2HSV ); cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 ); cvInRangeS(h_plane, cvScalar(11), cvScalar(12), h_range); cvInRangeS(s_plane, cvScalar(73), cvScalar(83), s_range); cvInRangeS(v_plane, cvScalar(188), cvScalar(188), v_range); } cvShowImage( "H", h_plane ); cvShowImage( "S", s_plane ); cvShowImage( "V", v_plane ); cvShowImage( "H range", h_range ); cvShowImage( "S range", s_range ); cvShowImage( "V range", v_range ); CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* contours=0; int contoursCont = cvFindContours( s_range, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(160,72)); CvSeq* h_next=0; for(CvSeq* seq0 = contours;seq0!=0;seq0 = seq0->h_next){ cvDrawContours(rio_copy, seq0, CV_RGB(0,0,0), CV_RGB(0,0,0), 0, 1, 8); cvShowImage("ROI_HSV", rio_copy_hsv); cvResetImageROI(rio_copy); cvShowImage("ROI", rio_copy); cvShowImage( "original", src ); char c = cvWaitKey(33); if (c == 27) { // если нажата ESC - выходим break; } } } // освобождаем ресурсы cvReleaseImage(&image); cvReleaseImage(&src); // удаляем окно cvDestroyWindow("original"); return 0; }
  4. Еще одна проблема, я поменял v2.3.1 на v2.4 перегрузил комп и у меня появляются теперь ошибки, Необработанное исключение в "0x7c812afb" в "Obrabot4ik_v3.2.exe": Исключение Microsoft C++: cv::Exception по адресу 0x0011ca34.. Я так понимаю что ошибки эти, из-за того что он не может найти картинку, но я описал все верно Mat Img=imread("C:\\proj\\proj2\\Obrabot4ik_v3.2\\Obrabot4ik_v3.2\\21.jpg"); и даже распихал эту картинку по всем директориям проекта и все без результатно, не подскажите как быть. А если вернуться в версию 2.3.1 то тоже Необработанное исключение в "0x7c812afb" в "Obrabot4ik_v3.2.exe": Исключение Microsoft C++: cv::Exception по адресу 0x0011f130.. но вылетает только после того когда нажимаю r?))))
  5. Да действительно из 8, поставил 10 все заработало) Спасибо еще раз за помощь эта штука мне очень помогла)!
  6. Спасибо ограмное! Очень крутая штука, хотел посмотреть как код работает и застрял на такой ошибки c:\program files\microsoft visual studio 9.0\vc\include\sstream(333) : error C2248: 'std::basic_streambuf<_Elem,_Traits>::operator =' : cannot access private member declared in class 'std::basic_streambuf<_Elem,_Traits>' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ] 1> c:\program files\microsoft visual studio 9.0\vc\include\streambuf(22) : see declaration of 'std::basic_streambuf<_Elem,_Traits>::operator =' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char> 1> ] 1> This diagnostic occurred in the compiler generated function 'std::basic_stringbuf<_Elem,_Traits,_Alloc> &std::basic_stringbuf<_Elem,_Traits,_Alloc>::operator =(const std::basic_stringbuf<_Elem,_Traits,_Alloc> &)' 1> with 1> [ 1> _Elem=char, 1> _Traits=std::char_traits<char>, 1> _Alloc=std::allocator<char> 1> ] Не могу понять в чем дело, если сталкивались с таким можете помочь? Гуглил и гугл мне ничего не нашел толкового
  7. А в принципе смысл я придумал такой, навожу на original image мышкой на пятно, он смотрит параметры, ищет такие же параметры по всей картинке и уже начинает бинарить hsv и складывать в общую бинарку. Я смотрю дальше , ага не все выделилось, вижу какой сегмент не выделился, тыкаю на него в любой пиксель и он бежит дальше. И так пока не помру или пока не выделю все.
  8. Потому что уж слишком тяжело мне даются опорные векторы.
  9. У меня такой вопрос Я разбиваю картинку на 3 канала. HSV. Можно ли как нибудь сделать так, чтобы допустим наводишь мышкой, на пиксель в канале ,допустим, H, и по щелчку можно было бы вывести в поток какое значение H имеет пиксель. Примерно также как и с координатами: void myMouseCallback( int event, int x, int y, int flags, void* param ) { IplImage* img = (IplImage*) param; switch( event ){ case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: printf("%d x %d\n", x, y); drawTarget(img, x, y, 10); break; case CV_EVENT_LBUTTONUP: break; } } Есть ли какой нибудь распознаватель у opencv для каналов HSV? Просто хочу знать с каким диапазоном работать.
  10. О спасибо большое! Начинаю мучить мозг, то что получится, обязательно поделюсь!
  11. Спасибо огромное за идею. Буду идти тогда в сторону обучения нейронных сетей. И если есть такая возможность, если есть примеры по нейро сетям с opencv, то можно ссылочку как бы это по круче реализовать.
  12. Добрый день. У меня такая задача, необходимо сегментировать пятна на фото(фото больных псариазом). У меня алгоритм в голове такой. Картинку перевожу в HSV->разбиваю на 3 канала-> ищу по цвету, контрасту и яркости-> соединяю все в один бинарник-> и с помощью CANNY выделяю пятна и вот она радость. Но у меня проблема, у меня стоит задача автоматизировать поиск по цвету, то есть задавать его не самому, а чтобы какой нибудь обработчик,бегал и выцеплял все значения. Это необходимо сделать потому что, диапазон значений по H S и V у пятен достаточно большой и если задавать тривиальный например от 0 до 11 H, и т.д. многие пятна не находятся. И собственно вопрос, как можно сделать такой обработчик, если кто нибудь сталкивался или видел, то можно плиз ссылочку, если есть такая тема в закромах форума можно ее тоже, потому что я вроде бы тут все облазил и по поиску искал, ничего не нашел. Заранее спасибо.
×