XoXol_89 3 Жалоба Опубликовано April 22, 2010 всем доброго времени суток)) взялся изучать OpenCV буквально недельку назад и столкнулся с несколькими проблемами... первое..где можно достать полную документацию (не он-лайн) второе..так как все пособия на английском, есть ли переводы того же OReilly если кто знает, буду признателен и еще у меня есть частный вопрос...для чего предназначена функция cvThreshold, и как выходные параметры зависят от входных? я в принципе соображаю в английском и понимаю его..но вот что то с этой функцией все не могу догнать.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
quosego 5 Жалоба Опубликовано April 22, 2010 Нет, на русском ничего нет, только форумы; еще в сети можно найти разные уроки, но они как правило достаточно простые и могут пригодиться только на самом первом этапе изучения opencv. По поводу cvThreshold void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double maxValue, int thresholdType ); src - входное изображение dst - выходное изображение threshold - значение порога maxValue - максимальное значение, используется по разному в зависимости от параметра thresholdType thresholdType - тип порога Функция cvThreshold применяет пороговую обработку. Функция используется, чтобы получить бинарное изображение из полутонового изображения. Есть несколько типов пороговой обработки, которые определены в thresholdType: thresholdType=CV_THRESH_BINARY: dst(x,y) = maxValue, if src(x,y)>threshold 0, otherwise thresholdType=CV_THRESH_BINARY_INV: dst(x,y) = 0, if src(x,y)>threshold maxValue, otherwise thresholdType=CV_THRESH_TRUNC: dst(x,y) = threshold, if src(x,y)>threshold src(x,y), otherwise thresholdType=CV_THRESH_TOZERO: dst(x,y) = src(x,y), if (x,y)>threshold 0, otherwise thresholdType=CV_THRESH_TOZERO_INV: dst(x,y) = 0, if src(x,y)>threshold src(x,y), otherwise Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано April 22, 2010 спасибо за объяснение)) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано May 4, 2010 еще такой вопрос есть. какой методикой лучше всего воспользоваться при захвате и сопровождении к примеру какого нибудь объекта (например желтый маркер)? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 4, 2010 еще такой вопрос есть. какой методикой лучше всего воспользоваться при захвате и сопровождении к примеру какого нибудь объекта (например желтый маркер)? В этом топике есть пример (с картинкой) сопровождения (почти желтого) объекта. http://www.compvision.ru/forum/index.php?showtopic=137 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано May 5, 2010 ок)) спасибо..я разобрался) теперь могу захватывать желтый объект и сопровождать его..а вот как например быть с такой проблемой.. необходимо захватить кисть руки, сопровождать ее и определять..сжата она или нет.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано May 5, 2010 Захватить по цвету/текстуре получается? Если да, то найди основные моменты (cvMoments) и посмотри на их значения - возможно этого хватит для определения сжатой/несжатой ладони. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано May 5, 2010 решил производить захват руки через определение скелета. взял пример с вашего сайта (skeleton) и переделал его для VS2008 вот, что у меня получилось.. <!--shcode-->#include "stdafx.h" #include "cv.h" #include "highgui.h" #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <iostream> //#include <vector.h> //------------------------------------------------------------------------- CvCapture* capture = 0; // Полученный кадр и копия кадра IplImage *frame, *frame_copy = 0; // Цветное изображение искомого объекта IplImage* object_color; // Для разложения по компонентам HSV изображения объекта (образца) IplImage* hsv_obj; IplImage* h_plane_obj; IplImage* s_plane_obj; IplImage* v_plane_obj; IplImage* planes_obj[2]; // Для разложения по компонентам HSV изображения с камеры IplImage* hsv_img; IplImage* h_plane_img; IplImage* s_plane_img; IplImage* v_plane_img; IplImage* planes_img[2]; // Здесь будет результат IplImage* back_project; // Параметры гистограммы int h_bins = 30, s_bins = 32; // Сама гистограмма CvHistogram* hist; // Описатель шрифта (см. дальше) CvFont font; double Val=100; void ProcessFrame( IplImage* image ); // Функция где обрабатывается видео //--------------------------------------------------------------------------- IplImage *distsrc; IplImage *out; IplImage *S00; IplImage *S45; IplImage *S90; IplImage *S135; CvMat kern00, kern45, kern90, kern135; float Smax=0; float L0[]={ -1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, -1,-1,-1,-1,-1 }; float L45[]={ 0,-1,-1, 0, 2, -1,-1, 0, 2, 0, -1, 0, 2, 0,-1, 0, 2, 0,-1,-1, 2, 0,-1,-1, 0 }; float L90[]={ -1, 0, 2, 0,-1, -1, 0, 2, 0,-1, -1, 0, 2, 0,-1, -1, 0, 2, 0,-1, -1, 0, 2, 0,-1 }; float L135[]={ 2, 0,-1,-1, 0, 0, 2, 0,-1,-1, -1, 0, 2, 0,-1, -1,-1, 0, 2, 0, 0,-1,-1, 0, 2 }; //------------------------------------------------------------------ //------------------------------------------------------------------ void LoadObjectImage(void) { /* // Проверка на использование IPP const char* plugin_info = 0; cvGetModuleInfo(0,0,&plugin_info); Form1->Caption=IntToStr(plugin_info != 0 && strstr(plugin_info,"ipp")!=0); */ object_color = cvLoadImage( "snapshot.jpg"); // Выделяем память для hsv и каждой из его плоскостей if( !hsv_obj ) { hsv_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 3 ); } cvCvtColor( object_color, hsv_obj, CV_BGR2HSV ); if(!h_plane_obj) h_plane_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 1 ); if(!s_plane_obj) s_plane_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 1 ); if(!v_plane_obj) v_plane_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 1 ); // Выделили память // Разобьем hsv по компонентам cvCvtPixToPlane( hsv_obj, h_plane_obj, s_plane_obj, v_plane_obj, 0 ); // Расчет гистограммы { int hist_size[] = { h_bins, s_bins }; float h_ranges[] = { 0, 180 }; // hue is [0,180] float s_ranges[] = { 0, 255 }; float* ranges[] = { h_ranges, s_ranges }; hist = cvCreateHist(2,hist_size,CV_HIST_ARRAY,ranges,1); } planes_obj[0]=h_plane_obj; planes_obj[1]=s_plane_obj; // Расчет гистограммы cvCalcHist( planes_obj, hist, 0, 0 ); // Нормализуем так, чтобы было видно на картинке cvNormalizeHist( hist, 20*255 ); // Выделим память под результат if(!back_project) back_project=cvCreateImage( cvSize(object_color->width,object_color->height), IPL_DEPTH_8U, 1 ); } //---------------------------------------------------------------------- void ProcessFrame( IplImage* image ) { cvCalcBackProject(planes_img,back_project,hist); cvSmooth( back_project, back_project, CV_GAUSSIAN, 9, 9 ); // сгладим, чтобы уменьшить помехи cvDilate( back_project, back_project, 0, 1 ); cvThreshold( back_project, back_project, Val,255,/*CV_THRESH_BINARY_INV*/CV_THRESH_BINARY); // Главная скелетонная функция подробнее опишу позже cvDistTransform(back_project,distsrc,CV_DIST_L2,5); cvFilter2D(distsrc,S00,&kern00); cvFilter2D(distsrc,S45,&kern45); cvFilter2D(distsrc,S90,&kern90); cvFilter2D(distsrc,S135,&kern135); for (int y=0; y < out->height; y++){ for (int x=0; x< out->width; x++){ Smax = MAX( MAX(((float*)(S00->imageData + y* S00->widthStep))[x], ((float*)(S45->imageData + y* S45->widthStep))[x]), MAX(((float*)(S90->imageData + y* S90->widthStep))[x], ((float*)(S135->imageData + y* S135->widthStep))[x])); ((float*)(out->imageData + y* out->widthStep))[x] = Smax > 0 ? Smax: 0.0; } } cvThreshold(out,out,7,1,CV_THRESH_BINARY); cvCvtScale( out, back_project, 255,0); // Рисуем результат /* cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE ); while(1) { cvShowImage( "Example2", object_color ); char c = cvWaitKey(100); if( c == 27 ) break; } */ //APIDrawIpl(10,10,object_color,Form1->Handle); // Рисуем результат //APIDrawIpl(object_color->width+10,10,image,Form1->Handle); // Рисуем результат //APIDrawIpl((object_color->width+10)*2,10,back_project,Form1->Handle); } //------------------------------------------------------ int _tmain(int argc, _TCHAR* argv[]) { capture = cvCaptureFromCAM(0); // ядро фильтра cvInitMatHeader(&kern00,5,5,CV_32FC1,L0); cvInitMatHeader(&kern45,5,5,CV_32FC1,L45); cvInitMatHeader(&kern90,5,5,CV_32FC1,L90); cvInitMatHeader(&kern135,5,5,CV_32FC1,L135); // Инициализация шрифта (теперь можем вывести какой-нибудь текст) cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,1,8); // Поток обработки простоя //Application->OnIdle = IdleLoop; //done = false;// Поток обработки простоя if( capture ) { // Даем приказ на захват кадра if( !cvGrabFrame( capture )) goto skip; // Если удачно - получаем кадр frame = cvRetrieveFrame( capture ); if( !frame ) // Если захват не удался - пропускаем дальнейшее goto skip; //********************************************************* // Если стерли то что ниже - это надо раскомментировать // frame_copy = cvCreateImage( cvSize(frame->width,frame->height), // IPL_DEPTH_8U, frame->nChannels ); // Делаем копию кадра, иначе может пропасть. // cvCopy( frame, frame_copy, 0 ); // Если стерли то что ниже - это надо раскомментировать //********************************************************* //********************************************************* // Если не нужно подгонять размер кадра - это можно стереть // Выделяем память под копию кадра if( !frame_copy ) frame_copy = cvCreateImage( cvSize(352,288), IPL_DEPTH_8U, frame->nChannels ); // Масштабируем под заданный размер //cvResize( frame, frame_copy, CV_INTER_LINEAR ); // Если не нужно подгонять размер кадра - это можно стереть //********************************************************* // Аналогично тому что сделано для объекта if( !hsv_img ) { hsv_img = cvCreateImage( cvSize(frame->width,frame->height), 8, 3 ); } cvCvtColor( frame, hsv_img, CV_BGR2HSV ); if(!h_plane_img) h_plane_img = cvCreateImage( cvSize(frame->width,frame->height), 8, 1 ); if(!s_plane_img) s_plane_img = cvCreateImage( cvSize(frame->width,frame->height), 8, 1 ); if(!v_plane_img) v_plane_img = cvCreateImage( cvSize(frame->width,frame->height), 8, 1 ); cvCvtPixToPlane( hsv_img, h_plane_img, s_plane_img, v_plane_img, 0 ); planes_img[0]=h_plane_img; planes_img[1]=s_plane_img; //----------------------------------------------- if(!distsrc) distsrc=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!S00) S00=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!S45) S45=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!S90) S90=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!S135) S135=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!out) out=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); //----------------------------------------------- // Выделяем память под серое изображение объекта if( !object_color ) { LoadObjectImage(); } // Обработка полученного кадра ProcessFrame( frame_copy ); } skip:; // Освобождаем ресурсы cvReleaseImage( &h_plane_obj ); cvReleaseImage( &s_plane_obj ); cvReleaseImage( &v_plane_obj ); cvReleaseImage( &hsv_obj ); cvReleaseImage( &distsrc); cvReleaseImage( &out); cvReleaseImage( &S00); cvReleaseImage( &S45); cvReleaseImage( &S90); cvReleaseImage( &S135); cvReleaseImage( &h_plane_img ); cvReleaseImage( &s_plane_img ); cvReleaseImage( &v_plane_img ); cvReleaseImage( &hsv_img ); cvReleaseHist(&hist); cvReleaseImage(&back_project); cvReleaseImage( &frame_copy ); cvReleaseImage( &object_color ); cvReleaseCapture( &capture ); return 0; }<!--ehcode--> и уже который раз натыкаюсь на непонятную мне ошибку. когда происходит выполнение функции void LoadObjectImage(void), то после обработке оператора object_color = cvLoadImage( "snapshot.jpg"), почему то объект object_color как был нулевым, так и остается..в результате чего далее происходит ошибка в уже следующем операторе hsv_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 3 ); файл snapshot.jpg загружен и находится в этом же каталоге, где и exeшник Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 5, 2010 решил производить захват руки через определение скелета. взял пример с вашего сайта (skeleton) и переделал его для VS2008 вот, что у меня получилось.. <!--shcode--><!--shcode-->#include "stdafx.h" #include "cv.h" #include "highgui.h" #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <iostream> //#include <vector.h> //------------------------------------------------------------------------- CvCapture* capture = 0; // Полученный кадр и копия кадра IplImage *frame, *frame_copy = 0; // Цветное изображение искомого объекта IplImage* object_color; // Для разложения по компонентам HSV изображения объекта (образца) IplImage* hsv_obj; IplImage* h_plane_obj; IplImage* s_plane_obj; IplImage* v_plane_obj; IplImage* planes_obj[2]; // Для разложения по компонентам HSV изображения с камеры IplImage* hsv_img; IplImage* h_plane_img; IplImage* s_plane_img; IplImage* v_plane_img; IplImage* planes_img[2]; // Здесь будет результат IplImage* back_project; // Параметры гистограммы int h_bins = 30, s_bins = 32; // Сама гистограмма CvHistogram* hist; // Описатель шрифта (см. дальше) CvFont font; double Val=100; void ProcessFrame( IplImage* image ); // Функция где обрабатывается видео //--------------------------------------------------------------------------- IplImage *distsrc; IplImage *out; IplImage *S00; IplImage *S45; IplImage *S90; IplImage *S135; CvMat kern00, kern45, kern90, kern135; float Smax=0; float L0[]={ -1,-1,-1,-1,-1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, -1,-1,-1,-1,-1 }; float L45[]={ 0,-1,-1, 0, 2, -1,-1, 0, 2, 0, -1, 0, 2, 0,-1, 0, 2, 0,-1,-1, 2, 0,-1,-1, 0 }; float L90[]={ -1, 0, 2, 0,-1, -1, 0, 2, 0,-1, -1, 0, 2, 0,-1, -1, 0, 2, 0,-1, -1, 0, 2, 0,-1 }; float L135[]={ 2, 0,-1,-1, 0, 0, 2, 0,-1,-1, -1, 0, 2, 0,-1, -1,-1, 0, 2, 0, 0,-1,-1, 0, 2 }; //------------------------------------------------------------------ //------------------------------------------------------------------ void LoadObjectImage(void) { /* // Проверка на использование IPP const char* plugin_info = 0; cvGetModuleInfo(0,0,&plugin_info); Form1->Caption=IntToStr(plugin_info != 0 && strstr(plugin_info,"ipp")!=0); */ object_color = cvLoadImage( "snapshot.jpg"); // Выделяем память для hsv и каждой из его плоскостей if( !hsv_obj ) { hsv_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 3 ); } cvCvtColor( object_color, hsv_obj, CV_BGR2HSV ); if(!h_plane_obj) h_plane_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 1 ); if(!s_plane_obj) s_plane_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 1 ); if(!v_plane_obj) v_plane_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 1 ); // Выделили память // Разобьем hsv по компонентам cvCvtPixToPlane( hsv_obj, h_plane_obj, s_plane_obj, v_plane_obj, 0 ); // Расчет гистограммы { int hist_size[] = { h_bins, s_bins }; float h_ranges[] = { 0, 180 }; // hue is [0,180] float s_ranges[] = { 0, 255 }; float* ranges[] = { h_ranges, s_ranges }; hist = cvCreateHist(2,hist_size,CV_HIST_ARRAY,ranges,1); } planes_obj[0]=h_plane_obj; planes_obj[1]=s_plane_obj; // Расчет гистограммы cvCalcHist( planes_obj, hist, 0, 0 ); // Нормализуем так, чтобы было видно на картинке cvNormalizeHist( hist, 20*255 ); // Выделим память под результат if(!back_project) back_project=cvCreateImage( cvSize(object_color->width,object_color->height), IPL_DEPTH_8U, 1 ); } //---------------------------------------------------------------------- void ProcessFrame( IplImage* image ) { cvCalcBackProject(planes_img,back_project,hist); cvSmooth( back_project, back_project, CV_GAUSSIAN, 9, 9 ); // сгладим, чтобы уменьшить помехи cvDilate( back_project, back_project, 0, 1 ); cvThreshold( back_project, back_project, Val,255,/*CV_THRESH_BINARY_INV*/CV_THRESH_BINARY); // Главная скелетонная функция подробнее опишу позже cvDistTransform(back_project,distsrc,CV_DIST_L2,5); cvFilter2D(distsrc,S00,&kern00); cvFilter2D(distsrc,S45,&kern45); cvFilter2D(distsrc,S90,&kern90); cvFilter2D(distsrc,S135,&kern135); for (int y=0; y < out->height; y++){ for (int x=0; x< out->width; x++){ Smax = MAX( MAX(((float*)(S00->imageData + y* S00->widthStep))[x], ((float*)(S45->imageData + y* S45->widthStep))[x]), MAX(((float*)(S90->imageData + y* S90->widthStep))[x], ((float*)(S135->imageData + y* S135->widthStep))[x])); ((float*)(out->imageData + y* out->widthStep))[x] = Smax > 0 ? Smax: 0.0; } } cvThreshold(out,out,7,1,CV_THRESH_BINARY); cvCvtScale( out, back_project, 255,0); // Рисуем результат /* cvNamedWindow( "Example2", CV_WINDOW_AUTOSIZE ); while(1) { cvShowImage( "Example2", object_color ); char c = cvWaitKey(100); if( c == 27 ) break; } */ //APIDrawIpl(10,10,object_color,Form1->Handle); // Рисуем результат //APIDrawIpl(object_color->width+10,10,image,Form1->Handle); // Рисуем результат //APIDrawIpl((object_color->width+10)*2,10,back_project,Form1->Handle); } //------------------------------------------------------ int _tmain(int argc, _TCHAR* argv[]) { capture = cvCaptureFromCAM(0); // ядро фильтра cvInitMatHeader(&kern00,5,5,CV_32FC1,L0); cvInitMatHeader(&kern45,5,5,CV_32FC1,L45); cvInitMatHeader(&kern90,5,5,CV_32FC1,L90); cvInitMatHeader(&kern135,5,5,CV_32FC1,L135); // Инициализация шрифта (теперь можем вывести какой-нибудь текст) cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,1,8); // Поток обработки простоя //Application->OnIdle = IdleLoop; //done = false;// Поток обработки простоя if( capture ) { // Даем приказ на захват кадра if( !cvGrabFrame( capture )) goto skip; // Если удачно - получаем кадр frame = cvRetrieveFrame( capture ); if( !frame ) // Если захват не удался - пропускаем дальнейшее goto skip; //********************************************************* // Если стерли то что ниже - это надо раскомментировать // frame_copy = cvCreateImage( cvSize(frame->width,frame->height), // IPL_DEPTH_8U, frame->nChannels ); // Делаем копию кадра, иначе может пропасть. // cvCopy( frame, frame_copy, 0 ); // Если стерли то что ниже - это надо раскомментировать //********************************************************* //********************************************************* // Если не нужно подгонять размер кадра - это можно стереть // Выделяем память под копию кадра if( !frame_copy ) frame_copy = cvCreateImage( cvSize(352,288), IPL_DEPTH_8U, frame->nChannels ); // Масштабируем под заданный размер //cvResize( frame, frame_copy, CV_INTER_LINEAR ); // Если не нужно подгонять размер кадра - это можно стереть //********************************************************* // Аналогично тому что сделано для объекта if( !hsv_img ) { hsv_img = cvCreateImage( cvSize(frame->width,frame->height), 8, 3 ); } cvCvtColor( frame, hsv_img, CV_BGR2HSV ); if(!h_plane_img) h_plane_img = cvCreateImage( cvSize(frame->width,frame->height), 8, 1 ); if(!s_plane_img) s_plane_img = cvCreateImage( cvSize(frame->width,frame->height), 8, 1 ); if(!v_plane_img) v_plane_img = cvCreateImage( cvSize(frame->width,frame->height), 8, 1 ); cvCvtPixToPlane( hsv_img, h_plane_img, s_plane_img, v_plane_img, 0 ); planes_img[0]=h_plane_img; planes_img[1]=s_plane_img; //----------------------------------------------- if(!distsrc) distsrc=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!S00) S00=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!S45) S45=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!S90) S90=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!S135) S135=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); if(!out) out=cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_32F,1); //----------------------------------------------- // Выделяем память под серое изображение объекта if( !object_color ) { LoadObjectImage(); } // Обработка полученного кадра ProcessFrame( frame_copy ); } skip:; // Освобождаем ресурсы cvReleaseImage( &h_plane_obj ); cvReleaseImage( &s_plane_obj ); cvReleaseImage( &v_plane_obj ); cvReleaseImage( &hsv_obj ); cvReleaseImage( &distsrc); cvReleaseImage( &out); cvReleaseImage( &S00); cvReleaseImage( &S45); cvReleaseImage( &S90); cvReleaseImage( &S135); cvReleaseImage( &h_plane_img ); cvReleaseImage( &s_plane_img ); cvReleaseImage( &v_plane_img ); cvReleaseImage( &hsv_img ); cvReleaseHist(&hist); cvReleaseImage(&back_project); cvReleaseImage( &frame_copy ); cvReleaseImage( &object_color ); cvReleaseCapture( &capture ); return 0; }<!--ehcode--><!--ehcode--> и уже который раз натыкаюсь на непонятную мне ошибку. когда происходит выполнение функции void LoadObjectImage(void), то после обработке оператора object_color = cvLoadImage( "snapshot.jpg"), почему то объект object_color как был нулевым, так и остается..в результате чего далее происходит ошибка в уже следующем операторе hsv_obj = cvCreateImage( cvSize(object_color->width,object_color->height), 8, 3 ); файл snapshot.jpg загружен и находится в этом же каталоге, где и exeшник Скорее всего ошибка с путями, можно попробовать указать полный путь к папке с изображением. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано May 5, 2010 неа. что так, что так..одно и тоже.. дело еще в том, что если я на вход получаю не видео, а изображение, то оно почему то все нормально работает. по крайней мере по другим вашим программам, которые я переделывал с Builder на VS2008. посмотрите пожалуйста..может где то что то я просто перепутал? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано May 5, 2010 ха))) все оказалось гораздо проще...просто надо было вставить туда изображение, полученное с собственной веб-камеры)) но вот я задумался..получаем мы эти скелеты..и что далее с ними делать? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 5, 2010 ха))) все оказалось гораздо проще...просто надо было вставить туда изображение, полученное с собственной веб-камеры)) Не сошлось по размерам. Если загруженное изображение привести к размерам кадра камеры, думаю получится с любой картинкой. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано May 5, 2010 согласен) после пару манипуляций и старое изображение стало подходить)) однако мне интересно..вот вы пишете, что оно отлично подходит для распознавания изображений и так далее. но каким образом? скелеты к примеру одного кулака на каком либо фоне получаются разными.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 5, 2010 согласен) после пару манипуляций и старое изображение стало подходить)) однако мне интересно..вот вы пишете, что оно отлично подходит для распознавания изображений и так далее. но каким образом? скелеты к примеру одного кулака на каком либо фоне получаются разными.. Все правильно, скелет надо получать уже после предварительной обработки изображения, должна быть двухцветная картинка, потом скелетонизация. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
XoXol_89 3 Жалоба Опубликовано May 6, 2010 то есть, как я понял, должен быть следующий порядок: 1. получаем изображение руки (к примеру ранее сделанное фото) 2. вырезаем руку с помощью алгоритмов по выделению объектов по цвету 3. создаем изображение с вырезанной рукой на черном фоне 4. преобразуем его в двухцветное 5. получаем скелет руки 6. затем тоже самое проделываем с изображениями, получаемые от видеокамеры 7. и сравниваем полученные скелеты (от видеокамеры) с исходным (фото) единственно возникает вопрос..а как реализуется сравнение скелетов? с помощью каких функций? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
janizary 0 Жалоба Опубликовано May 19, 2010 Добрый день. Подскажите пожалуйста, в чём может быть проблема, если при компиляции выходят следующие ошибки : Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvNormalizeHist в функции "void __cdecl LoadObjectImage(void)" (?LoadObjectImage@@YAXXZ) Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvCreateHist в функции "void __cdecl LoadObjectImage(void)" (?LoadObjectImage@@YAXXZ) Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvCvtColor в функции "void __cdecl LoadObjectImage(void)" (?LoadObjectImage@@YAXXZ) Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvFilter2D в функции "void __cdecl ProcessFrame(struct _IplImage *)" (?ProcessFrame@@YAXPAU_IplImage@@@Z) Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvDistTransform в функции "void __cdecl ProcessFrame(struct _IplImage *)" Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 19, 2010 Добрый день. Подскажите пожалуйста, в чём может быть проблема, если при компиляции выходят следующие ошибки : Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvNormalizeHist в функции "void __cdecl LoadObjectImage(void)" (?LoadObjectImage@@YAXXZ) Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvCreateHist в функции "void __cdecl LoadObjectImage(void)" (?LoadObjectImage@@YAXXZ) Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvCvtColor в функции "void __cdecl LoadObjectImage(void)" (?LoadObjectImage@@YAXXZ) Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvFilter2D в функции "void __cdecl ProcessFrame(struct _IplImage *)" (?ProcessFrame@@YAXPAU_IplImage@@@Z) Skeletons.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvDistTransform в функции "void __cdecl ProcessFrame(struct _IplImage *)" Подключите к проекту статические библиотеки (Lib). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
janizary 0 Жалоба Опубликовано May 21, 2010 спасибо))) уже сама поняла Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах