c++ opencv

文章目录

  • 错误
    • 1. C2039 "channels": 不是 "cv::DataType<_Tp>" 的成员
    • 2. 注意cv::mat的类型
    • 3. cv::mat求inv
    • 4. vector subscript out of range
    • 5. 使用determinant求行列式注意点
  • 其他
    • 1.Vec3b的赋值与访问
    • 2. cv::mean
    • 3. 将cv::mat三通道改为单通道且保持形状不变

错误

1. C2039 “channels”: 不是 “cv::DataType<_Tp>” 的成员

在对cv::mat类型赋值时,使用了uint,改为uchar即可

Mat mask(4, 1, CV_8UC1, Scalar(0));
mask.at<uint>(0,0) = 1;

改为

Mat mask(4, 1, CV_8UC1, Scalar(0));
mask.at<uchar>(0,0) = 1;

2. 注意cv::mat的类型

当你发现使用at出错时,应该先看是不是类型错误
时刻要注意类型应保持一致,比如cv::mat dataVec3f类型的,你用at访问时却写成了data.at<Vec3b>,此时就会报错:

OpenCV(4.5.5) Error: Assertion failed (((0x28442211 >> ((traits::Depth<_Tp>::value) & ((1 << 3) - 1))*4) & 15) == elemSize1()) in cv::Mat::at, file E:\ProfessionApp\opencv-4.5.5\build\include\opencv2\core\mat.inl.hpp, line 900

如下示例,其中data的类型为CV_32F,故访问它时就不能用Vec3b

for (int i = 0; i < data.rows; ++i) {
	Vec3b& tmp = data.at<Vec3b>(i, 0);
}

应改为:

for (int i = 0; i < data.rows; ++i) {
	Vec3f& tmp = data.at<Vec3f>(i, 0);
}

3. cv::mat求inv

求矩阵的逆时矩阵必须为floatdouble类型的

Mat m = (Mat_<double>(3, 3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);
cout << m.inv() << endl;

4. vector subscript out of range

在求矩阵的逆的时候碰到了vector subscript out of range错误,后面发现是因为求逆后把逆放入vector容器中,而那个vector未初始化就直接使用下标,应该先初始化。

CovInv[i] = Cov[i].inv();

5. 使用determinant求行列式注意点

cv::mat需要为CV_32F或者CV_64类型,可以通过convertTo进行修改;并且需要行数等于列数,其中行数为3列数为1三通道是不行的,若要求其行列式,可以利用reshape将其改为单通道,这样列数就变为了3

M.convertTo(M, CV_32F);
M = M.reshape(1, 0);

另外可以从报错可以看出来错误的原因:

OpenCV(4.5.5) Error: Assertion failed (mat.rows == mat.cols && (type == CV_32F || type == CV_64F)) in cv::determinant, file C:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\lapack.cpp, line 776

通过(mat.rows == mat.cols && (type == CV_32F || type == CV_64F))即可得知错误原因。



其他

1.Vec3b的赋值与访问

Vec3b v1;
v1[0] = 97;
v1[1] = 243;
v1[2] = 2;
cout << "v1:"<<v1 << endl;
cout << v1[0] << endl;

输出:
v1:[97, 243, 2]
a

访问单个元素(如v1[0])输出的是ascii码表中对应的值,所以有时候会打印不出来内容,此时可以用printf指定打印类型打印。

2. cv::mean

Scalar mean(InputArray src, InputArray mask=noArray())

参数

  • 参数 src 输入数组,具有1到4个通道,结果保存在Scalar_ 。

  • 参数 mask 可选参数,操作掩摸,用于标记求取哪些区域的均值和标准差。

当有mask参数时,计算mask参数值大于0的对应的rgb三通道的均值

Mat mask(4, 1, CV_8UC1, Scalar(1));
mask.at<uchar>(2,0) = 0;
Scalar m1 = mean(M3, mask);

cout << M3 << endl;
cout << mask << endl;
cout << m1 << endl;

// 只计算了第0、1、3个rgb的均值
输出:
[245, 207, 173;
 244, 202, 167;
 254, 200, 165;
 246, 206, 171]
 [  1;
   1;
   0;
   1]
[245, 205, 170.333, 0]

当mask值都大于0但各不相同的时候,和没有mask得到的结果一致,计算的是所有数据的rgb的均值

Mat mask(4, 1, CV_8UC1, Scalar(1));
mask.at<uchar>(2,0) = 2;
Scalar m1 = mean(M3, mask);

cout << M3 << endl;
cout << mask << endl;
cout << m1 << endl;
cout << mean(M3) << endl;
// 只计算了第0、1、3个rgb的均值
输出:
[245, 207, 173;
 244, 202, 167;
 254, 200, 165;
 246, 206, 171]
 [  1;
   1;
   2;
   1]
[247.25, 203.75, 169, 0]
[247.25, 203.75, 169, 0]

3. 将cv::mat三通道改为单通道且保持形状不变

若直接用calcCovarMatrix计算三通道cv::mat,则会报以下错:

OpenCV(4.5.5) Error: Assertion failed (src.channels() == 1) in cv::mulTransposed, file C:\build\master_winpack-build-win64-vc15\opencv\modules\core\src\matmul.dispatch.cpp, line 886

报错上写了failed (src.channels() == 1),说明通道数应为1,此时直接用cv::reshape改其通道数即可,另外需要注意的是,cv::cvtColor(image, image, cv::COLOR_BGR2RGB)也可以将三通道转换为单通道,但是这个的转换是指将三个通道取平均值变为单通道的值,比如像素点(0,0)的rgb值分别为240,236,242,则转换后的单通道值为239.33。
另外需要注意的是,得到的结果不是协方差,而是 ∑ i = 1 n ( x i − x ‾ ) ( y i − y ‾ ) \sum_{i=1}^{n}(x_i-\overline x)(y_i-\overline y) i=1n(xix)(yiy),而协方差的公式是 ∑ i = 1 n ( x i − x ‾ ) ( y i − y ‾ ) n − 1 \frac{\sum_{i=1}^{n}(x_i-\overline x)(y_i-\overline y)}{n-1} n1i=1n(xix)(yiy),相差了一个分母n-1

Mat Mat::reshape(int cn,int rows=0) const
cn:表示通道数(channels),如果设置为0,则表示通道不变;
如果设置为其他数字,表示要设置的通道数
rows:表示矩阵行数,如果设置为0,则表示保持原有行数不变,如果设置为其他数字,表示要设置的行数

Mat img = cv::imread("./img.jpg");
Mat M3;
M3.push_back(img.at<Vec3b>(0, 0));
M3.push_back(img.at<Vec3b>(0, 1));
M3.push_back(img.at<Vec3b>(0, 2));
M3.push_back(img.at<Vec3b>(1, 0));

cout << M3 << endl;
	
Mat samples;
M3.convertTo(samples, CV_32FC1);

cout << "samples:" << endl << samples << endl;
cout << "samples channels:" << samples.channels() << endl;
// 第一个参数:通道数,第二个参数:函数,0表示不变
samples = samples.reshape(1, 0);
cout << "samples channels:" << samples.channels() << endl;
Mat cov, mu;
calcCovarMatrix(samples, cov, mu, CV_COVAR_NORMAL | CV_COVAR_ROWS);
cout << cov << endl;
cout << mu << endl;

输出:

[245, 207, 173;
 244, 202, 167;
 254, 200, 165;
 246, 206, 171]
samples:
[245, 207, 173;
 244, 202, 167;
 254, 200, 165;
 246, 206, 171]
samples channels:3
samples channels:1
[62.75, -29.75, -32;
 -29.75, 32.75, 36;
 -32, 36, 40]
[247.25, 203.75, 169]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/578012.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

军工单位安全内网文件导出,怎样做到严密的安全管控?

军工单位是指承担国家下达的军事装备、产品研制、生产计划任务的企、事业单位&#xff0c;主要包括电子工业部、航空工业总公司、航天工业总公司、兵器工业总公司、核工业总公司、船舶工业总公司、中国工程物理研究院及各省国防工业办公室等。 军工单位的特点主要体现在以下几个…

(学习日记)2024.04.20:UCOSIII第四十八节:各文件功能概览

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

和鲸科技出席第五届空间数据智能学术会议,执行总裁殷自强受邀发表主题报告

4月26日&#xff0c;由 ACM SIGSPATIAL 中国分会、ACM SIGMOD 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff0c;下简称“会议”&#xff09;在南京盛大开幕。本次会议特邀李清泉院士、周成虎院士、丛高教授、谢炯博士、张雪英教授等国内外知名…

Matlab|交直流混合配电网潮流计算(统一求解法)

目录 1 主要内容 算例模型 统一求解法迭代方程 算法流程图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序为matlab代码&#xff0c;采用统一求解法对交直流混合配电网进行潮流计算&#xff0c;统一迭代法又称统一求解法&#xff0c;其思路是将混联系统中的交流网…

基于springboot实现中药实验管理系统设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现中药实验管理系统设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足&#xff0c;创建了一个计算机管理中药实验管…

LMDeploy量化部署LLMVLM实践-笔记五

本次课程由西北工业大学博士生、书生浦源挑战赛冠军队伍队长、第一期书生浦语大模型实战营优秀学员【安泓郡】讲解【OpenCompass 大模型评测实战】课程 课程视频&#xff1a;https://www.bilibili.com/video/BV1tr421x75B/ 课程文档&#xff1a;https://github.com/InternLM/…

Redis高级篇详细讲解

0.今日菜单 Redis持久化【理解】 Redis主从 Redis哨兵 Redis分片集群【运维】 单点Redis的问题 数据丢失问题&#xff1a;Redis是内存存储&#xff0c;服务重启可能会丢失数据 并发能力问题&#xff1a;单节点Redis并发能力虽然不错&#xff0c;但也无法满足如618这样的高…

有什么因素会影响IP稳定性?

IP稳定性指的是IP地址在一段时间内保持不变的能力&#xff0c;对于网络连接的安全性和可靠性至关重要。以下是一些可能影响IP稳定性的主要因素&#xff1a; 网络服务提供商&#xff08;ISP&#xff09;的政策&#xff1a;不同的ISP对于IP地址的管理和使用有不同的政策。一些IS…

视频滚动字幕一键批量轻松添加,解锁高效字幕编辑,提升视频质量与观众体验

视频已成为我们获取信息、娱乐休闲的重要渠道。一部成功的视频作品&#xff0c;除了画面精美、音质清晰外&#xff0c;字幕的添加也是至关重要的一环。字幕不仅能增强视频的观感&#xff0c;还能提升信息的传达效率&#xff0c;让观众在享受视觉盛宴的同时&#xff0c;更加深入…

16.Blender 基础渲染工作流程及安装ACES

安装插件和菜单栏设置 在菜单栏的编辑里打开偏好设置 里面的插件界面 搜索node 给第三个打勾 点击安装&#xff0c;导入cat插件 安装完后&#xff0c;一定要打勾&#xff0c;选择上cat插件 这样N窗口才会显示MMD选项 导入场景 点击打开 把输出模式的帧率改为30fps 按…

【redis】Redis数据类型(一)——String类型(包含redis通用命令)

目录 Redis通用命令String类型常用的操作命令一些特殊命令详解setnx示例使用 setrange示例 mset示例 msetnx示例 append示例 getset示例 incr示例使用1.计数器2.限速器 bitcount示例使用&#xff1a;使用 bitmap 实现用户上线次数统计性能 String类型String类型简介String类型的…

LeetCode57. 插入区间

LeetCode57.插入区间 题目思路: 代码 /* 前置知识&#xff1a; vector<vector<int>> a,b; 二维vector数组是可以将二维中的一维vector数组给push_back的&#xff0c; 不是只有单个元素才可以&#xff0c;整个一维的vector数组也可以 b[0] {1,2,3},b[1] {4,5,6}…

AI大模型探索之路-训练篇2:大语言模型预训练基础认知

文章目录 前言一、预训练流程分析二、预训练两大挑战三、预训练网络通信四、预训练数据并行五、预训练模型并行六、预训练3D并行七、预训练代码示例总结 前言 在人工智能的宏伟蓝图中&#xff0c;大语言模型&#xff08;LLM&#xff09;的预训练是构筑智慧之塔的基石。预训练过…

优先级队列(堆)和四个比较(==,equals,Comparable,Comparator)

本节具体阐述堆的概念和自己如何实现堆(底层) 掌握PriorityQueue的使用 优先级概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优 先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的…

Docker共享Nginx配置文件

先去一个容器中&#xff0c;找到Nginx.conf配置文件的目录 去创建一个容器&#xff0c;将容器中存放nginx.conf的目录挂载到宿主机存放nginx.conf目录上 去宿主机中找到nginx/html/index.html目录位置 进入宿主机的index.html中修改页面内容 curl 192.168.91.106访问一下 进入…

Tomcat安装和配置以及多实例部署(附脚本)

TOMCAT详细部署 Tomcat服务器简介核心组件Tomcat 各组件及关系工作流程 Tomcat server.xml 配置详解serverserviceConnectorEngineHostContextValve 阀门 Tomcat部署与安装部署脚本主要目录说明 Tomcat多实例部署扩展和优化 Tomcat 的 catalina.sh 文件以调整 JVM 参数 Tomcat服…

lt Redis变慢的原因及排查解决方法

前言 Redis 作为优秀的内存数据库&#xff0c;其拥有非常高的性能&#xff0c;单个实例的 OPS 能够达到 10W 左右(5-10W)。但也正因此如此&#xff0c;当我们在使用 Redis 时&#xff0c;如果发现操作延迟变大的情况&#xff0c;就会与我们的预期不符。 你也许或多或少地&…

LLaMA-Factory参数的解答(命令,单卡,预训练)

前面这个写过&#xff0c;但觉得写的不是很好&#xff0c;这次是参考命令运行脚本&#xff0c;讲解各个参数含义。后续尽可能会更新&#xff0c;可以关注一下专栏&#xff01;&#xff01; *这是个人写的参数解读&#xff0c;我并非该领域的人如果那个大佬看到有参数解读不对或…

一文扫盲:数据中台,可不是搞几个报表就叫中台。

Hi&#xff0c;我是贝格前端工场&#xff0c;相比大家会经常听说数据中台这个词汇&#xff0c;很多老铁会想当然的人为数据中台就是各种报表&#xff0c;本文给大家纠正和普及一下。 一、什么是数据中台 数据中台是指一个企业内部的数据管理和分发平台&#xff0c;它通过集中…

​解析什么是物联网接入网关?-天拓四方

随着物联网技术的飞速发展&#xff0c;越来越多的设备、传感器和系统被连接到互联网&#xff0c;形成了一个庞大的、相互连接的智能网络。在这个网络中&#xff0c;物联网接入网关扮演着至关重要的角色&#xff0c;它不仅是连接物联网设备和云平台的桥梁&#xff0c;还是实现设…