记录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 提供的索引:
具体类型解释:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!