zoukankan      html  css  js  c++  java
  • 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。

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <vector>
    
    int main()
    {
    	//////////////////////////////////////////////////////////////////////////
    	// cv::Point --> cv::Mat 可以使用cv::Mat_<cv::Point3f>, 或初始化时{}赋值
    	// vector<float> --> cv:Mat 可以使用{}赋值
    	cv::Point3f v1(34.0f, 21.34f, 32.0f);
    
    	// 1. cv::Mat_<cv::Point3f>
    	// 三种赋值方式可以实现由Point3f到Mat的转换, 但是通道数不是1
    	//cv::Mat m1 = cv::Mat_<cv::Point3f>(v1);
    	cv::Mat m1{ cv::Mat_<cv::Point3f>(v1) };
    	//cv::Mat_<cv::Point3f>(v1).assignTo(m1);
    
    	std::cout << "m1: " << m1 << "	channels: " << m1.channels() << "	size(width x height): " << m1.size() << "
    ";
    	m1 = m1.reshape(1);
    	std::cout << "m1: " << m1 << "	channels: " << m1.channels() << "	size(width x height): " << m1.size() << "
    ";
    
    	// 2. cv::Mat{v1}
    	cv::Mat m2{ v1 };
    	//cv::Mat m2;
    	//m2 = cv::Mat(v1);
    	//cv::Mat(v1).copyTo(m2);
    	std::cout << "m2.t(): " << m2.t() << "	channels: " << m2.channels() << "	size(width x height): " << m2.size() << "
    ";
    
    	// 3. vector<*> --> Mat 自动选择类型
    	std::vector<double> vec{ 21.3, -10, 34.0, 3.2, 3.4 };
    	cv::Mat m3{ vec }; 
    	std::cout << "m3.t(): " << m2.t() << "	channels: " << m3.channels() << "	size(width x height): " << m3.size() << "	type: " << m3.type() << "
    " ;
    
    	std::vector<uchar> uvec{ 2, 9, 29 };
    	cv::Mat m4{ uvec };
    	std::cout << "m4.t(): " << m4.t() << "	channels: " << m4.channels() << "	size(width x height): " << m4.size() << "	type: " << m4.type() << "
    ";
    
    	std::vector<cv::Point2f> vecpts{ cv::Point2f(2.3, 3.1), cv::Point2f(9.3, -10.0) };
    	cv::Mat m5{ vecpts };
    	std::cout << "m5: " << m5 << "	channels: " << m5.channels() << "	size(width x height): " << m5.size() << "	type: " << m5.type() << "
    ";
    	return 0;
    }
    

    运行结果如图:

  • 相关阅读:
    [职场]最近聊到30岁以上的程序员,该何去何从了?你有啥想法?
    想跳槽涨薪,想进大厂,如何准备面试呢?
    [面试分享]想跳槽涨薪,想进大厂,如何准备面试呢?
    缓存穿透、缓存并发、缓存雪崩、缓存抖动、热点缓存、缓存双写一致性等问题...
    8天玩转并行开发——第八天 用VS性能向导解剖你的程序
    8天入门wpf—— 第一天 基础概念介绍
    8天玩转并行开发——第六天 异步编程模型
    8天入门wpf—— 第八天 最后的补充
    6天通吃树结构—— 第二天 平衡二叉树
    8天入门wpf—— 第七天 画刷
  • 原文地址:https://www.cnblogs.com/zi-wang/p/9800640.html
Copyright © 2011-2022 走看看