【NCNN】NCNN中Mat与CV中Mat的使用区别及相互转换方法

目录

  • 相同点与不同点
  • cv::Mat转ncnn::Mat
    • [cv::Mat CV_8UC3 -> ncnn::Mat 3 channel + swap RGB/BGR](#cv::Mat CV_8UC3 -> ncnn::Mat 3 channel + swap RGB/BGR)
    • [cv::Mat CV_8UC3 -> ncnn::Mat 1 channel + do RGB2GRAY/BGR2GRAY](#cv::Mat CV_8UC3 -> ncnn::Mat 1 channel + do RGB2GRAY/BGR2GRAY)
    • [cv::Mat CV_8UC1 -> ncnn::Mat 1 channel](#cv::Mat CV_8UC1 -> ncnn::Mat 1 channel)
  • ncnn::Mat转cv::Ma
    • [ncnn::Mat 3 channel -> cv::Mat CV_8UC3 + swap RGB/BGR](#ncnn::Mat 3 channel -> cv::Mat CV_8UC3 + swap RGB/BGR)
    • [ncnn::Mat 3 channel -> cv::Mat CV_8UC3 + keep RGB/BGR order](#ncnn::Mat 3 channel -> cv::Mat CV_8UC3 + keep RGB/BGR order)
    • [ncnn::Mat 1 channel -> cv::Mat CV_32FC1](#ncnn::Mat 1 channel -> cv::Mat CV_32FC1)
    • [ncnn::Mat multiple channels -> std::vector < cv::Mat > + CV_32FC1](#ncnn::Mat multiple channels -> std::vector < cv::Mat > + CV_32FC1)

相同点与不同点

ncnn::Mat和cv::Mat在某些方面是相似的,但也存在一些区别。

相似之处:

ncnn::Mat和cv::Mat都是用于表示图像或矩阵数据的类。

它们都提供了类似的API,可以访问和操作图像数据。

它们都支持多种像素格式和通道数。

区别之处:

库的不同:ncnn::Mat是ncnn库中的数据类型,用于在ncnn中进行模型推理和图像处理。而cv::Mat是OpenCV库中的数据类型,用于图像处理和计算机视觉任务。

数据存储方式:ncnn::Mat使用行优先存储方式,而cv::Mat使用列优先存储方式。这意味着在访问像素时,它们的内存布局是不同的。

功能和用途:ncnn::Mat主要用于在ncnn中进行模型推理和图像处理,提供了与ncnn库相关的功能和接口。cv::Mat主要用于图像处理和计算机视觉任务,提供了丰富的图像处理和计算机视觉函数。

总结来说,ncnn::Mat和cv::Mat在用途和功能上有一些差异,但它们都用于处理图像和矩阵数据,并提供了类似的API,以便于访问和操作这些数据。

ncnn中数据的排列格式为(channel, h, w), cv::Mat中数据的排列格式为(h, w, channel).

cv::Mat转ncnn::Mat

cv::Mat CV_8UC3 -> ncnn::Mat 3 channel + swap RGB/BGR

cpp 复制代码
// cv::Mat a(h, w, CV_8UC3);
ncnn::Mat in = ncnn::Mat::from_pixels(a.data, ncnn::Mat::PIXEL_BGR2RGB, a.cols, a.rows);

cv::Mat CV_8UC3 -> ncnn::Mat 1 channel + do RGB2GRAY/BGR2GRAY

bash 复制代码
ncnn::Mat inbgr = ncnn::Mat::from_pixels(bgr.data, ncnn::Mat::PIXEL_BGR2GRAY, bgr.cols, bgr.rows);

cv::Mat CV_8UC1 -> ncnn::Mat 1 channel

bash 复制代码
ncnn::Mat in = ncnn::Mat::from_pixels(a.data, ncnn::Mat::PIXEL_GRAY, a.cols, a.rows);

ncnn::Mat转cv::Ma

ncnn::Mat 3 channel -> cv::Mat CV_8UC3 + swap RGB/BGR

bash 复制代码
cv::Mat a(in.h, in.w, CV_8UC3);
in.to_pixels(a.data, ncnn::Mat::PIXEL_BGR2RGB);

ncnn::Mat 3 channel -> cv::Mat CV_8UC3 + keep RGB/BGR order

bash 复制代码
// ncnn::Mat in(w, h, 3);
cv::Mat a(in.h, in.w, CV_8UC3);
in.to_pixels(a.data, ncnn::Mat::PIXEL_RGB);

ncnn::Mat 1 channel -> cv::Mat CV_32FC1

bash 复制代码
You could consume or manipulate ncnn::Mat data directly to avoid data copy
// ncnn::Mat in;
cv::Mat a(in.h, in.w, CV_32FC1);
memcpy((uchar*)a.data, in.data, in.w * in.h * sizeof(float));

ncnn::Mat multiple channels -> std::vector < cv::Mat > + CV_32FC1

bash 复制代码
// ncnn::Mat in(w, h, channels);
std::vector<cv::Mat> a(in.c);
for (int p=0; p<in.c; p++)
{
    a[p] = cv::Mat(in.h, in.w, CV_32FC1);
    memcpy((uchar*)a[p].data, in.channel(p), in.w * in.h * sizeof(float));
}
相关推荐
熊文豪几秒前
借助 AI Ping 的 Kimi-K2-Thinking 与 ClaudeCode 的加解密工具开发
人工智能·aiping
阿杰学AI1 分钟前
AI核心知识45——大语言模型之PPO(简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·aigc·ppo·近端策略优化
da_vinci_x4 分钟前
PS 神经滤镜:一张夏天变雪景?场景美术的“季节魔术”
人工智能·3d·aigc·建模·游戏美术·pbr·场景美术
CoovallyAIHub5 分钟前
南京理工大学联手百度、商汤科技等团队推出Artemis:用结构化视觉推理革新多模态感知
深度学习·算法·计算机视觉
深蓝易网6 分钟前
MES系统如何帮助企业实现产品质量的全过程追溯
大数据·人工智能
free-elcmacom6 分钟前
机器学习进阶<7>人脸识别特征锚点Python实现
人工智能·python·机器学习·rbfn
天才少女爱迪生7 分钟前
图像序列预测有什么算法方案
人工智能·python·深度学习·算法
乐迪信息9 分钟前
乐迪信息:AI摄像机+反光衣佩戴检测,保障智慧煤矿人员作业安全
大数据·运维·人工智能·物联网·安全
胖墩会武术9 分钟前
【PyTorch项目实战】Ultralytics YOLO模型本地部署(训练 + 测试 + 推理)
人工智能·pytorch·yolo
劈星斩月10 分钟前
计算机视觉-OpenCV-学习系列
opencv·计算机视觉