Opencv扭曲透视整个图像
Opencv Warp perspective whole image
我正在努力解决这个问题:
我有一个图像,我想对它应用一个翘曲透视(我已经有了变换矩阵),但不是输出只有变换区域(像下面的例子),我想要能够看到整个图像。
http://docs.opencv.org/trunk/_images/perspective.jpg例子
不像这个例子那样有一个变换区域,我想对整个原始图像进行变换。
我怎样才能做到这一点?
谢谢!
似乎您正在通过选择输入图像中的数独网格的角并要求它们在输出图像中的固定位置弯曲来计算透视变换。在您的示例中,似乎您要求左上角在坐标(0,0)处弯曲,右上角在坐标(300,0)处弯曲,左下角在坐标(0,300)处弯曲,右下角在坐标(300,300)处弯曲。
这将始终导致裁剪两个左角的左侧和两个上角上方的图像区域(即输出图像中x<0或y<0的图像区域)。另外,如果您指定的输出图像大小为300x300,这将导致右侧的图像区域被裁剪到右下角和底部角以下。
如果你想保留整个图像,你需要为角落使用不同的输出坐标。例如,将TLC转换为(100,100),TRC转换为(400,100),BLC转换为(100,400),BRC转换为(400,400),并指定输出图像大小为600x600。
你也可以计算最优坐标如下:
- 计算默认的透视变换H0(就像你现在做的那样)
- 使用H0变换输入图像的角,并计算这些角的x和y坐标的最小值和最大值。我们把它们记为xmin, xmax, ymin, ymax。
- 计算将点(xmin,ymin)映射到(0,0)所需的平移。这个平移的矩阵是T = [1,0, -xmin;0,1, -ymin;[0,0,1].
- 计算优化后的透视变换H1 = T*H0,并指定输出图像大小为(xmax-xmin) x (ymax-ymin)。
这样,您就可以保证:
- 输入数独网格的四个角将形成一个真正的正方形
- 输出图像将被翻译,以便没有有用的图像数据被裁剪到网格角的上方或左侧
- 输出图像将被调整大小,以便没有有用的图像数据被裁剪到网格角的下方或右侧
然而,这会产生黑色区域,因为输出图像不再是一个完美的矩形,因此输出图像中的一些像素在输入图像中没有任何对应关系。
Edit 1:如果您想用其他东西替换黑色区域,您可以根据需要初始化目标矩阵,然后将warpPerspective
函数的borderMode
参数设置为BORDER_TRANSPARENT
。
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 将图像添加到资源文件夹UWP C++
- 彩色图像的卤化物处理平均值
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 重新定位图像时如何前进到下一个内存块
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 为什么 BMP 图像上的 imwrite 会卡住/不返回?
- Gstreamer:每 5 秒使用多文件墨水保存图像/jpeg
- Opencv扭曲透视整个图像
- 扭曲图像的反透视变换
- 三维头部的透视投影和z -缓冲以形成面部图像