Всем привет! У меня такой вопрос, достаточно тривиальный, но мне не поддается.
Идея в чем, есть изображение, достаю из него 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;
}