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

изучение OpenCV

Recommended Posts

всем доброго времени суток))

взялся изучать OpenCV буквально недельку назад и столкнулся с несколькими проблемами...

первое..где можно достать полную документацию (не он-лайн)

второе..так как все пособия на английском, есть ли переводы того же OReilly

если кто знает, буду признателен

и еще у меня есть частный вопрос...для чего предназначена функция cvThreshold, и как выходные параметры зависят от входных?

я в принципе соображаю в английском и понимаю его..но вот что то с этой функцией все не могу догнать..

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


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

Нет, на русском ничего нет, только форумы; еще в сети можно найти разные уроки, но они как правило достаточно простые и могут пригодиться только на самом первом этапе изучения 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

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


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

еще такой вопрос есть. какой методикой лучше всего воспользоваться при захвате и сопровождении к примеру какого нибудь объекта (например желтый маркер)?

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


Ссылка на сообщение
Поделиться на других сайтах
еще такой вопрос есть. какой методикой лучше всего воспользоваться при захвате и сопровождении к примеру какого нибудь объекта (например желтый маркер)?

В этом топике есть пример (с картинкой) сопровождения (почти желтого) объекта.

http://www.compvision.ru/forum/index.php?showtopic=137

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


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

ок)) спасибо..я разобрался) теперь могу захватывать желтый объект и сопровождать его..а вот как например быть с такой проблемой..

необходимо захватить кисть руки, сопровождать ее и определять..сжата она или нет..

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


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

Захватить по цвету/текстуре получается? Если да, то найди основные моменты (cvMoments) и посмотри на их значения - возможно этого хватит для определения сжатой/несжатой ладони.

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


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

решил производить захват руки через определение скелета.

взял пример с вашего сайта (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шник

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


Ссылка на сообщение
Поделиться на других сайтах
решил производить захват руки через определение скелета.

взял пример с вашего сайта (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шник

Скорее всего ошибка с путями, можно попробовать указать полный путь к папке с изображением.

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


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

неа. что так, что так..одно и тоже..

дело еще в том, что если я на вход получаю не видео, а изображение, то оно почему то все нормально работает. по крайней мере по другим вашим программам, которые я переделывал с Builder на VS2008. посмотрите пожалуйста..может где то что то я просто перепутал?

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


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

ха))) все оказалось гораздо проще...просто надо было вставить туда изображение, полученное с собственной веб-камеры))

но вот я задумался..получаем мы эти скелеты..и что далее с ними делать?

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


Ссылка на сообщение
Поделиться на других сайтах
ха))) все оказалось гораздо проще...просто надо было вставить туда изображение, полученное с собственной веб-камеры))

Не сошлось по размерам. Если загруженное изображение привести к размерам кадра камеры, думаю получится с любой картинкой.

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


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

согласен) после пару манипуляций и старое изображение стало подходить))

однако мне интересно..вот вы пишете, что оно отлично подходит для распознавания изображений и так далее. но каким образом? скелеты к примеру одного кулака на каком либо фоне получаются разными..

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


Ссылка на сообщение
Поделиться на других сайтах
согласен) после пару манипуляций и старое изображение стало подходить))

однако мне интересно..вот вы пишете, что оно отлично подходит для распознавания изображений и так далее. но каким образом? скелеты к примеру одного кулака на каком либо фоне получаются разными..

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

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


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

то есть, как я понял, должен быть следующий порядок:

1. получаем изображение руки (к примеру ранее сделанное фото)

2. вырезаем руку с помощью алгоритмов по выделению объектов по цвету

3. создаем изображение с вырезанной рукой на черном фоне

4. преобразуем его в двухцветное

5. получаем скелет руки

6. затем тоже самое проделываем с изображениями, получаемые от видеокамеры

7. и сравниваем полученные скелеты (от видеокамеры) с исходным (фото)

единственно возникает вопрос..а как реализуется сравнение скелетов? с помощью каких функций?

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


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

Добрый день. Подскажите пожалуйста, в чём может быть проблема, если при компиляции выходят следующие ошибки :

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 *)"

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


Ссылка на сообщение
Поделиться на других сайтах
Добрый день. Подскажите пожалуйста, в чём может быть проблема, если при компиляции выходят следующие ошибки :

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).

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×