其他分享
首页 > 其他分享> > 记录opencv使用extractChannel获取单通道时访问报错

记录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