记录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 默认通道顺序));

这里在用extractChannel获取通道的时候,类型使用的是: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/204f292937bb 提供的索引:

 

 具体类型解释:

 

posted @ 2022-04-30 12:28  耿明岩  阅读(706)  评论(0编辑  收藏  举报
希望能帮助到你,顺利解决问题! ...G(^_−)☆