EMGU CV中ConvertMaps()使用异常及定点DepthTypes缺失求助
Emgu.CV 4.8.1中ConvertMaps()调用异常的解决方法
使用NuGet安装的Emgu.CV 4.8.1.5350版本时,遇到如下问题:当X、Y映射Mat定义为DepthType.Cv32F时,CvInvoke.Remap()可正常运行,但调用ConvertMaps()尝试将其转换为定点值时,抛出异常:
OpenCV: dstm1type == CV_16SC2 || dstm1type == CV_32FC1 || dstm1type == CV_32FC2
但Emgu.CV.CvEnum.DepthType枚举中并没有CV_16SC2、CV_32FC1或CV_32FC2这些值,导致无法直接指定对应类型调用ConvertMaps()。
错误代码示例
Dim BScanToPPIMap_X As New Mat(m_CompositePPIMat.Size, DepthType.Cv32F, 1, XMapHandle.AddrOfPinnedObject(), m_CompositePPIMat.Width * 4) Dim BScanToPPIMap_Y As New Mat(m_CompositePPIMat.Size, DepthType.Cv32F, 1, YMapHandle.AddrOfPinnedObject(), m_CompositePPIMat.Width * 4) m_BScanToPPIMap_X = New Mat(m_CompositePPIMat.Size, DepthType.Cv32S, 1) m_BScanToPPIMap_Y = New Mat(m_CompositePPIMat.Size, DepthType.Cv32S, 1) CvInvoke.ConvertMaps(BScanToPPIMap_X, BScanToPPIMap_Y, m_BScanToPPIMap_X, m_BScanToPPIMap_Y, DepthType.Default, 1) XMapHandle.Free() YMapHandle.Free() BScanToPPIMap_X.Dispose() BScanToPPIMap_Y.Dispose()
问题根源
错误在于误以为ConvertMaps()的目标类型必须是非浮点类型,实际上该函数支持的目标类型包括单通道32位浮点(对应异常提示中的CV_32FC1),而Emgu中可以通过DepthType.Cv32F+通道数1来匹配这个类型。
修正后的可用代码
Dim BScanToPPIMap_X As New Mat(m_CompositePPIMat.Size, DepthType.Cv32F, 1, XMapHandle.AddrOfPinnedObject(), m_CompositePPIMat.Width * 4) Dim BScanToPPIMap_Y As New Mat(m_CompositePPIMat.Size, DepthType.Cv32F, 1, YMapHandle.AddrOfPinnedObject(), m_CompositePPIMat.Width * 4) m_BScanToPPIMap_X = New Mat(m_CompositePPIMat.Size, DepthType.Cv32F, 1) m_BScanToPPIMap_Y = New Mat(m_CompositePPIMat.Size, DepthType.Cv32F, 1) CvInvoke.ConvertMaps(BScanToPPIMap_X, BScanToPPIMap_Y, m_BScanToPPIMap_X, m_BScanToPPIMap_Y, DepthType.Cv32F, 1) XMapHandle.Free() YMapHandle.Free() BScanToPPIMap_X.Dispose() BScanToPPIMap_Y.Dispose()
关键说明
- 若需要使用异常提示中的
CV_16SC2类型(16位有符号整数双通道),可以创建Mat时指定DepthType.Cv16S+通道数2,但需确保输入的映射矩阵格式与该类型匹配。 ConvertMaps()的目标类型并非必须为整数类型,保持浮点类型同样可以正常完成映射转换,且能避免类型不匹配的异常。
内容的提问来源于stack exchange,提问作者Sails1000
相关产品推荐
相关产品推荐

