Mat 的几种初始化和赋值方法

这几天用到了由cv::Point3fstd::vector<float>cv::Mat数据类型的转换。本质上就是换一下容器。今晚做个小总结。

Point3fMat

有两种方法,一种使用cv::Mat_<cv::Point3f>(),另一种是在声明时使用{}初始化。**注意:**第一种方法得到的Mat的数据类型的通道数不为1,需要使用reshape()函数,第二种方式得到的通道数为1。

vector<float>Mat

比较简单的方法是在Mat声明时,使用{}初始化。或者使用cv::Mat(std::vector<float>)进行赋值也可以。比较省心的是,OpenCV根据vector数据中的类型自动选择通道数与数据类型。

若为uchar, float, double, 则通道数则为1, 若为cv::Point2f, cv::Point3f,则通道数则为2, 3。

1#include <opencv2/opencv.hpp> 2#include <iostream> 3#include <vector> 4 5int main() 6{ 7 ////////////////////////////////////////////////////////////////////////// 8 // cv::Point --> cv::Mat 可以使用cv::Mat_<cv::Point3f>, 或初始化时{}赋值 9 // vector<float> --> cv:Mat 可以使用{}赋值 10 cv::Point3f v1(34.0f, 21.34f, 32.0f); 11 12 // 1. cv::Mat_<cv::Point3f> 13 // 三种赋值方式可以实现由Point3f到Mat的转换, 但是通道数不是1 14 //cv::Mat m1 = cv::Mat_<cv::Point3f>(v1); 15 cv::Mat m1{ cv::Mat_<cv::Point3f>(v1) }; 16 //cv::Mat_<cv::Point3f>(v1).assignTo(m1); 17 18 std::cout << "m1: " << m1 << "\tchannels: " << m1.channels() << "\tsize(width x height): " << m1.size() << "\n"; 19 m1 = m1.reshape(1); 20 std::cout << "m1: " << m1 << "\tchannels: " << m1.channels() << "\tsize(width x height): " << m1.size() << "\n"; 21 22 // 2. cv::Mat{v1} 23 cv::Mat m2{ v1 }; 24 //cv::Mat m2; 25 //m2 = cv::Mat(v1); 26 //cv::Mat(v1).copyTo(m2); 27 std::cout << "m2.t(): " << m2.t() << "\tchannels: " << m2.channels() << "\tsize(width x height): " << m2.size() << "\n"; 28 29 // 3. vector<*> --> Mat 自动选择类型 30 std::vector<double> vec{ 21.3, -10, 34.0, 3.2, 3.4 }; 31 cv::Mat m3{ vec }; 32 std::cout << "m3.t(): " << m2.t() << "\tchannels: " << m3.channels() << "\tsize(width x height): " << m3.size() << "\ttype: " << m3.type() << "\n" ; 33 34 std::vector<uchar> uvec{ 2, 9, 29 }; 35 cv::Mat m4{ uvec }; 36 std::cout << "m4.t(): " << m4.t() << "\tchannels: " << m4.channels() << "\tsize(width x height): " << m4.size() << "\ttype: " << m4.type() << "\n"; 37 38 std::vector<cv::Point2f> vecpts{ cv::Point2f(2.3, 3.1), cv::Point2f(9.3, -10.0) }; 39 cv::Mat m5{ vecpts }; 40 std::cout << "m5: " << m5 << "\tchannels: " << m5.channels() << "\tsize(width x height): " << m5.size() << "\ttype: " << m5.type() << "\n"; 41 return 0; 42}

运行结果如图:

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )