Я пытаюсь рассчитать и отобразить плотный оптический поток в OpenCV, используя метод farneback. Я нашел пример, который использует функции CUDA для его генерации и отображения карты цветов, которую я использовал в качестве основы для своего собственного кода.
Расчет оптического потока:
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
Любая помощь / альтернативное решение будет очень признателен.
Ошибка в том, что вы забыли настроить hsv_ptr для указателя данных imgColorHSV в вашем первом цикле for. Чтобы применить преобразование HSV в RGB, вы можете использовать функцию OpenCV cvColor
Других решений пока нет …