tii20 0 Жалоба Опубликовано June 11, 2012 Всем привет! У меня такой вопрос, достаточно тривиальный, но мне не поддается. Идея в чем, есть изображение, достаю из него 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; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tii20 0 Жалоба Опубликовано June 11, 2012 В принципе я понял почему рамку рисует, потому что, когда RIO вытягивается, картинка в нем одного размера, а окно для отображения другого, и часть окна в сером. Думаю если убрать заработает. И собственно вопрос) тогда в другом, как подогнать размер окна под RIO? cvNamedWindow("V range",CV_WINDOW_AUTOSIZE); в Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
tii20 0 Жалоба Опубликовано June 11, 2012 Затупил. Не там цикл закрыл)) и с рамкой пришлось size окна подгонять под RIO. Может кому то пригодится тема) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах