改变Mat的类型

2019/03/20 OpenCV学习笔记
浏览 - 次 字数798

在使用OpenCV的GPU加速库中的傅立叶函数时,总是会莫名的报错,使用try/catch语句捕获异常后,输出如下信息:

error:(-215:Assertion failed) src.type() == CV_32FC1   src.type() == CV_32FC2 in function’ ‘anonymous-namespace’::DFTImpl::compute’

查看官方文档,找到参数的如下说明:

Only CV_32FC1 images are supported for now.

该函数目前仅支持CV_32FC1类型的图像

既然问题的原因找到了,只要对输入图像的类型做一次转化即可,于是调用了Mat的convertTo函数去转换图像类型,再次调试,上面的异常依旧存在,说明图像的类型还是没有转换正确。在代码中设置断点,并开启ImageWatch插件,对输入到内存的图像进行监控,发现经过convertTo函数的处理,图像由3xUNIT8转变为3xFLOAT32,说明图像数据确实发生了变化 ,那么问题出在什么地方呢?答案是通道

OpenCV中,图像类型由图像的深度以及通道共同组成,

即 type() = depth() + channel()

出于严谨对待事物的态度,我仔细的查阅了官方文档对convertTo()函数的解释

Converts an array to another data type with optional scaling.

将数据类型转换成另一种选择的数据类型

这个描述模棱两可,经验证该函数仅能改变Mat的depth(),而不能改变channel(),那么图像的通道如何改变呢?当然是cvtColor()函数。

经过上述折腾算是,调通了函数,综上:

就图像Mat而言:

​ type() = depth() + channel()

是故,对图像的type()进行纠正,需要同时使用convertTo()以及cvtColort两个函数。

Search

    Table of Contents