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

cvFindContours+RIO

Recommended Posts

Всем привет! У меня такой вопрос, достаточно тривиальный, но мне не поддается.

Идея в чем, есть изображение, достаю из него 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;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В принципе я понял почему рамку рисует, потому что, когда RIO вытягивается, картинка в нем одного размера, а окно для отображения другого, и часть окна в сером.

Думаю если убрать заработает.

И собственно вопрос) тогда в другом, как подогнать размер окна под RIO?

cvNamedWindow("V range",CV_WINDOW_AUTOSIZE);

в

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Может кому то пригодится тема)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×