2013-12-23 8 views
0

farneback 메소드를 사용하여 OpenCV에서 밀도가 높은 광학 플로우를 계산하고 표시하려고합니다. 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

첫 번째 for 루프에서 hsv_ptr을 imgColorHSV 데이터 포인터로 설정하는 것을 잊었습니다. HSV를 RGB 변환에 적용하려면 OpenCV 기능을 사용할 수 있습니다. cvColor