记录opencv使用extractChannel获取单通道时访问报错
作者:互联网
使用extractChannel获取单通道数据时,遇到指针访问报错:
extractChannel原型:
void extractChannel(InputArray src, OutputArray dst, int coi)
问题代码:
extractChannel(*img, cv::Mat(img->rows, img->cols, CV_32FC1, data + img->rows * img->cols), 0)
img: 提取通道图片
cv::Mat(img->rows, img->cols, CV_32FC1, data + img->rows * img->cols): 这里目的是把提取到的单通道数据放到data(float*)指针指向的位置。
0: 提取第一个通道
visual studio报错:
主要原因是Mat数据类型不一致,默认imread读取图片Mat类型为: CV_8UC3(CV_8U: 8位无符号整数 C3: BGR三通道(opencv 默认通道顺序));
这里在获取通道的时候,类型使用的是:CV_32FC1(CV_32F: 32 位浮点数 C1:一个通道)
具体看最终使用场景, 两种解决办法:
在使用extractChannel获取通道时,把数据类型: CV_32FC1 改为 CV_8UC1 ,程序正常通过。
extractChannel(*img, cv::Mat(img->rows, img->cols, CV_8UC1, data + img->rows * img->cols), 0)
或者使用opencv的convertTo函数,把Mat数据类型从CV_8UC3转成CV_32FC1:
img.convertTo(img, CV_32FC3, 1.0);
主要是需要使用extractChannel获取单通道数据时,需要输入、输出Mat数据类型一致。
可以通过Mat::type函数,获取当前Mat数据类型:
img.type()
type返回值可以参照:https://www.jianshu.com/p/31d4ed7badcc 提供的索引:
具体类型解释:
标签:rows,Mat,img,cols,opencv,报错,extractChannel,CV,单通道 来源: https://www.cnblogs.com/GengMingYan/p/16209887.html