Я играл с функциями оптического потока в OpenCV и застрял.Я успешно сгенерировал поля и карты оптического потока X и Y, используя метод Farneback, но я не знаю, как применить это к координатам входного изображения, чтобы деформировать изображения.Результирующие поля X и Y имеют 32-битный тип с плавающей запятой (0-1,0), но как это соотносится с координатами входного и выходного изображений?Например, 1.0 чего?Ширина изображения?Разница между ними?
Плюс, я не уверен, как будет выглядеть мой цикл для применения трансформации / деформации.Я сделал много циклов, чтобы изменить цвет, но пиксели всегда остаются в одном и том же месте.Перемещение пикселей вокруг - это новая территория для меня!
Обновление: я получил это на работу, но получающееся изображение грязное:
//make a float copy of 8 bit grayscale source image
IplImage *src_img = cvCreateImage(img_sz, IPL_DEPTH_32F, 1);
cvConvertScale(input_img,src_img,1/255.0); //convert 8 bit to float
//create destination image
IplImage *dst_img = cvCreateImage(img_sz, IPL_DEPTH_32F, 1);
for(y = 0; y < flow->height; y++){
//grab flow maps for X and Y
float* vx = (float*)(velx->imageData + velx->widthStep*y);
float* vy = (float*)(vely->imageData + vely->widthStep*y);
//coords for source and dest image
const float *srcpx = (const float*)(src_img->imageData+(src_img->widthStep*y));
float *dstpx = (float*)(dst_img->imageData+(dst_img->widthStep*y));
for(x=0; x < flow->width; x++)
{
int newx = x+(vx[x]);
int newy = (int)(vy[x])*flow->width;
dstpx[newx+newy] = srcpx[x];
}
}
Я не мог заставить это работатьНа выходе был просто искаженный шум:
cvRemap(src_img,dst_img,velx,vely,CV_INTER_CUBIC,cvScalarAll(0));