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.mzph.cn/diannao/3846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言——内存函数的实现与模拟

1. memcpy 函数 与strcpy 函数类似 1.头文件 <string.h> 2.基本格式 • 函数memcpy从source的位置开始向后复制num个 字节 的数据到destination指向的内存位置。 • 这个函数在遇到 \0 的时候并不会停下来。 • 如果source和destination有任何的重叠&#xff0…

2024年钉钉直播回放怎么下载

又到了2024年,最近钉钉迎来了一波更新,经过我的研究,总算研究出来了一个方法,并且做成了工具 首先&#xff0c;让我们了解一下钉钉直播回放的下载方法。 钉钉直播回放工具链接&#xff1a;https://pan.baidu.com/s/1oPWJOp8L2SBDlklt_t5WQQ?pwd1234 提取码&#xff1a;1234 -…

sml emacs 安装问题记录

sml & emacs 安装问题记录 可以直接用brew装&#xff0c;很方便 brew install --cask emacsbrew install smlnj --cask安装完smlng后测试sml命令 确认可以正常运行 如果找不到命令&#xff0c;需要配置环境变量 确认终端使用的是 zsh 还是 bash, 使用 echo $SHELL如果是zs…

Python Web开发框架详解:Django与Flask的比较与实践

Python Web开发框架详解&#xff1a;Django与Flask的比较与实践 在Python的Web开发领域&#xff0c;Django和Flask是两个非常受欢迎的框架。它们各自具有独特的特点和优势&#xff0c;适用于不同的开发场景。本文将对这两个框架进行详细的解释和比较&#xff0c;并给出一些实用…

【快速上手ESP32(基于ESP-IDFVSCode)】10-事件循环WiFi

事件循环 本来这篇文章是只写WiFi的&#xff0c;但是写的时候才发现离不开事件循环&#xff0c;因此再多添一点内容在WiFi前面。 事件循环简单来说就是一个&#xff08;循&#xff09;环&#xff0c;我们可以在这个环上绑上一些事件&#xff0c;我们也可以监听这个环&#xf…

JavaScript进阶(十五):JS 垃圾回收机制_vue gc

内存&#xff1a;由可读写单元组成&#xff0c;表示一片可操作空间&#xff1b;管理&#xff1a;人为的去操作一片空间的申请、使用和释放&#xff1b;内存管理&#xff1a;开发者主动申请空间、使用空间、释放空间&#xff1b;管理流程&#xff1a;申请-使用-释放&#xff1b;…

CodeTalker 踩坑实录

开源地址 GitHub - Doubiiu/CodeTalker: [CVPR 2023] CodeTalker: Speech-Driven 3D Facial Animation with Discrete Motion Prior 提供了预训练 运行报错 File "D:\Program Files\miniconda3\lib\site-packages\transformers\models\wav2vec2\modeling_wav2vec2.py&quo…

oracle sql monitor简单使用说明

一 sql monitor介绍 二 用命令行方式生成sql monitor报告 set long 1000000 set longchunksize 100000 set linesize 1000 set pagesize 0 set trim on set trimspool on set echo off set feedback off spool report_sql_monitor.html select dbms_sqltune.report_s…

线性代数-行列式-p1 矩阵的秩

目录 1.定义 2. 计算矩阵的秩 3. 矩阵的秩性质 1.定义 2. 计算矩阵的秩 3. 矩阵的秩性质

美国言语听力学会(ASHA)关于非处方 (OTC) 助听器的媒体声明(翻译稿)

美国国会于 2021 年 4 月 13 日批准美国听力学会积极提供建议&#xff0c;并一直积极参与制定FDA关于非处方助听器销售的拟议法规。根据2017年通过的立法授权。学院积极参与帮助塑造授权立法&#xff0c;并就即将出台的条例分享了建议。 根据美国卫生与公众服务部NIH / NIDCD的…

用Python绘制了几张有趣的可视化图表

流程图存在于我们生活的方方面面&#xff0c;对于我们追踪项目的进展&#xff0c;做出各种事情的决策都有着巨大的帮助&#xff0c;而对于的Python而言呢&#xff0c;绘制流程图也是十分轻松的&#xff0c;今天小编就来为大家介绍两个用于绘制流程图的模块&#xff0c;我们先来…

基于Web的停车场管理系统设计与实现:技术总结与展望

引言 随着社会经济的快速发展&#xff0c;汽车保有量的激增使得停车难问题日益凸显。为了有效解决这一问题&#xff0c;本人在导师的指导下&#xff0c;设计并实现了一套基于Web的停车场管理系统。本文将从技术角度出发&#xff0c;详细总结本系统的设计思路、技术细节以及实现…

12 JavaScript学习: 字符串

JavaScript 字符串 JavaScript 字符串是一种用于存储和操作文本数据的数据类型。字符串可以包含字母、数字、符号和空格等字符。在 JavaScript 中&#xff0c;字符串可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#xff09;来定义。 例如&#xff1a;…

链表与模拟LinkedList的实现

1. ArrayList的缺陷 ArrayList底层使用数组来存储元素 由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xff0c;就需要将后序元素整体往前或者往后 搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低。因此ArrayList不适合做任意位…

机械臂过程

rosdep install --from-paths src --ignore-src --rosdistro melodic0、安装机械手臂 官方教程&#xff1a; 前人教程&#xff1a;UR5机械臂仿真实例 rosdep update 出错&#xff0c;使用小鱼的大佬的 一键配置 wget http://fishros.com/install -O fishros && . fish…

多快好省 | 餐饮零售业敏感数据保护建设思路

01 背景&场景 谈及“大数据”&#xff0c;很多人首先想到的是各类社交媒体、电信通讯商等大型技术企业&#xff0c;作为涉及用户个人信息的餐饮与零售业往往被忽视。不论是线上外卖平台、线下连锁餐饮行业&#xff0c;还是连锁商超、新零售等行业&#xff0c;在全面线上化、…

JS设置Ajax为同步或异步

在使用 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;时&#xff0c;可以通过设置 XMLHttpRequest 对象的 async 属性来控制请求是同步&#xff08;synchronous&#xff09;还是异步&#xff08;asynchronous&#xff09;。 异步&#xff08;Asynchronous&…

Rest微服务案例

Rest 父工程构建microservicecloud-api公共子模块Modulemicroservicecloud-provider-dept-8001部门微服务提供者Modulemicroservicecloud-consumer-dept-80部门微服务消费者Module 以Dept部门模块做一个微服务通用案例 Consumer消费者&#xff08;Client&#xff09;通过REST调…

ssm082基于java斗车交易系统设计与实现+vue

斗车交易系统 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&…

第三篇:Python编程基础:掌握核心语法与开发技巧

Python编程基础&#xff1a;掌握核心语法与开发技巧 1 引言 在这个信息化迅速蔓延的世界中&#xff0c;Python语言如同钥匙一般开启了通往各种可能性的大门。无论你是数据科学家、网络工程师、机器学习专家&#xff0c;还是仅仅对自动化办公感兴趣的办公室人员&#xff0c;Pyt…