Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将光流场(float)映射到像素数据(char)以进行图像扭曲?_C++_C_Graphics_Image Processing_Opencv - Fatal编程技术网

C++ 如何将光流场(float)映射到像素数据(char)以进行图像扭曲?

C++ 如何将光流场(float)映射到像素数据(char)以进行图像扭曲?,c++,c,graphics,image-processing,opencv,C++,C,Graphics,Image Processing,Opencv,我一直在玩OpenCV中的光流函数,我被卡住了。我已经使用Farneback方法成功地生成了X和Y光流场/贴图,但我不知道如何将其应用于输入图像坐标以扭曲图像。生成的X和Y字段是32位浮点类型(0-1.0),但这如何转换为输入和输出图像的坐标?例如,什么的1.0?图像的宽度?两者的区别是什么 另外,我不确定应用变换/扭曲时我的循环会是什么样子。我已经做了很多循环来改变颜色,但是像素总是保持在相同的位置。移动像素对我来说是一个新领域 更新:我让它工作,但结果图像很混乱: //make a floa

我一直在玩OpenCV中的光流函数,我被卡住了。我已经使用Farneback方法成功地生成了X和Y光流场/贴图,但我不知道如何将其应用于输入图像坐标以扭曲图像。生成的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];
    }
}

流矢量是速度值。如果图像1中位于位置
(x,y)
的像素具有流向量
(vx,vy)
,则估计其位于位置
(x+vx,y+vy)
(因此值实际上不在
[0,1]
范围内-它们可能更大,也可能为负值)。执行扭曲的最简单方法是使用这些值创建浮点图像(
x+vx
用于x方向,类似于y),然后使用OpenCV使用
cv::remap


光流为您提供X或Y方向上每个像素块的速度K,因此从流图返回的浮点值是速度值?是这样吗?速度值如何应用于像素坐标?每个块由像素组成,每个块的像素共享块的速度。使用图像大小和生成的速度矩阵计算像素块映射没有“块”,这是一个密集光流算法,每个像素有一个速度。好的,我听了你的建议,现在我让它在X轴上工作!我仍然需要弄清楚如何更新Y轴。使用cvRemap()的目的是什么?它在x和y方向上完全相同,没有理由一个“工作”,另一个不工作。并且
cv::remap
执行翘曲。如果你使用C++,你不应该使用 CVReMeX,因为你的标签说,OpenCV有一个独特的C++接口。我更新了上面的帖子来显示我正在使用的代码。我无法让cvRemap工作。我使用C语法,我把C++放在标签里的唯一原因是因为OpenCV的大部分是基于C++的(我必须使用G++来编译)。OpenCV的工作非常完美,只有C,你可以用GCC编译东西。如果您必须使用g++进行编译,那是出于其他原因。对不起,让我澄清一下。问题是,如果我设置XCODE来编译C而不是C++,那么我会得到一组链接错误(未定义的符号)。
cvRemap(src_img,dst_img,velx,vely,CV_INTER_CUBIC,cvScalarAll(0));
def warp_flow(img, flow):
    h, w = flow.shape[:2]
    flow = -flow
    flow[:,:,0] += np.arange(w)
    flow[:,:,1] += np.arange(h)[:,np.newaxis]
    res = cv2.remap(img, flow, None, cv2.INTER_LINEAR)
    return res