2013-12-23 4 views
0

Я пытаюсь вычислить и отобразить плотный оптический поток в OpenCV с использованием метода farneback. Я нашел пример, который использует функции CUDA для его создания и отображения цветовой карты, которую я использовал в качестве базы для своего собственного кода. Расчет оптического потока:Цветовая карта оптического потока в OpenCV

calcOpticalFlowFarneback(prevgray, gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0); 
drawField(flow,cflow); 
imshow("flows",cflow); 

Функция дисплея:

void drawField(const Mat& flow, Mat& imgColor){ 
Mat imgColorHSV = cv::Mat::zeros(Size(imgColor.cols,imgColor.rows),CV_32FC3); 

float max_s = 0; 
float *hsv_ptr; 
unsigned char *color_ptr; 
unsigned char r = 0, g = 0, b = 0; 
float angle = 0.0; 
float h = 0.0, s = 0.0, v = 0.0; 
float deltaX = 0.0, deltaY = 0.0; 
int x = 0, y = 0; 

for(y=0;y<imgColor.rows;y++) 
{ 
    for(x=0;x<imgColor.cols;x++) 
    { 
     const Point2f& fxy=flow.at<Point2f>(y,x); 
     deltaX=fxy.x; 
     deltaY=fxy.y; 
     angle=atan2(deltaX,deltaY); 

     if(angle<0) 
      angle+=2*M_PI; 

     hsv_ptr[3*x]=angle*180/M_PI; 
     hsv_ptr[3*x+1]=sqrt(deltaX*deltaX+deltaY*deltaY); 
     hsv_ptr[3*x+2]=0.9; 

     if(hsv_ptr[3*x+1]>max_s) 
      max_s=hsv_ptr[3*x+1]; 
    } 
} 

for(y=0;y<imgColor.rows;y++) 
{ 
    hsv_ptr=imgColorHSV.ptr<float>(y); 
    color_ptr=imgColor.ptr<unsigned char>(y); 

    for(x=0;x<imgColor.cols;x++) 
    { 
     h=hsv_ptr[3*x]; 
     s=hsv_ptr[3*x+1]/max_s; 
     v=hsv_ptr[3*x+2]; 

     hsv2rgb(h,s,v,r,g,b); 

     color_ptr[3*x]=b; 
     color_ptr[3*x+1]=g; 
     color_ptr[3*x+2]=r; 
    } 
} 

drawLegendHSV(imgColor,15,25,15); 
} 

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

Unhandled exception at at 0x757A4B32 in advection2.exe: Microsoft C++ exception: cv::Exception at memory location 0x00ADF4C8. 

И окно часы говорит, что

flow identifier "flow" is undefined 

Любая помощь/альтернативное решение будет очень ценна.

ответ

0

Ошибка в том, что вы забыли настроить hsv_ptr на указатель данных imgColorHSV в своих первых циклах. Чтобы применить преобразование HSV к RGB, вы можете использовать функцию OpenCV cvColor

Смежные вопросы