假设我有一组这样的重Map:(假设图像设置和代码工作)
for(int i=0; i<NumberOfImages; i++)
{
remap( inputImage, outImages[i], m_mapX[i], m_mapY[i], CV_INTER_NN );
}
字符串
现在我想在outputImages上找到输入图像上的像素(X,Y)的位置(假设remap是以一种输入图像上的任何像素都只Map到一个输出图像的方式)
最简单的方法是在所有m_mapX和m_mapY上进行搜索并查找所需的像素,但这非常耗时。有更好的方法吗?
假设我有一个很大的点列表,我需要转换,所以可能创建一个反向Map是更好的,但如何创建一个反向Map?
1条答案
按热度按时间s8vozzvw1#
对于重新Map的图像,OpenCV(版本4.7和更高版本)提供了一种更直接的方法,使用函数
[cv::initInverseRectificationMap][1]
。(K
)、失真系数和校正(R
)和投影(P
)矩阵,通常从相机校准或立体校正中获得。您可以使用这些参数来计算逆校正图,这将允许您在重新Map后找到未失真图像中像素的原始位置。此函数生成两个Map
invMapX
和invMapY
,可与cv::remap
一起使用以执行逆校正。Map类型CV_16SC2
是OpenCV中使用的预定义格式,用于为每个像素存储两个16位有符号整数。使用此类型时,invMapX
和invMapY
中的每个像素就像指向其在原始图像中的对应位置的固定索引一样工作。下面是正确的代码:
字符串
确保矩阵
k, DistCoeff, R,
和P
使用相机校准的结果正确初始化。