OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换

这篇具有很好参考价值的文章主要介绍了OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 使用常规方法将cv::Mat转换为unsigned char数组或者float数组

通常情况下,在同一个opencv项目传递cv::Mat可直接通过const cv::Mat& img这种方式传递,但是如果需要进行跨语言传递,比如C++传递到C#或者C#传递到C++,那么通常这种情况下需要将cv::Mat转换为内存指针比如unsigned char指针或者float指针进行传递。

1.1 cv::Mat转换为unsigned char数组、unsigned char数组转换为cv::Mat

#include <iostream>
#include "opencv/cv.h"
#include "opencv2/opencv.hpp"


void ConvertOpencvMatToArray()
{
	cv::Mat img = cv::imread("demo.png");

	int img_length = img.total() * img.channels();
	unsigned char* image_array_ptr = new unsigned char[img_length]();

	std::memcpy(image_array_ptr, img.ptr<unsigned char>(0), img_length * sizeof(unsigned char));

	// 从unsigned char* 再转换为cv::Mat,验证转换是否正确
	cv::Mat a = cv::Mat(img.rows, img.cols, img.type(), image_array_ptr);
	cv::imwrite("a.jpg", a);

	delete[] image_array_ptr;
}


int main()
{
	ConvertOpencvMatToArray();


	getchar();

	return 0;
}

1.2 cv::Mat转换为float数组、float数组转换为cv::Mat

#include <iostream>
#include "opencv/cv.h"
#include "opencv2/opencv.hpp"


void ConvertOpencvMatToArray()
{
	cv::Mat img = cv::imread("demo.png");
	
	img.convertTo(img, CV_32FC3);

	int img_length = img.total() * img.channels();
	float* image_array_ptr = new float[img_length]();

	std::memcpy(image_array_ptr, img.ptr<float>(0), img_length * sizeof(float));

	// 从float* 再转换为cv::Mat,验证转换是否正确
	cv::Mat a = cv::Mat(img.rows, img.cols, img.type(), image_array_ptr);
	cv::imwrite("a.jpg", a);

	delete[] image_array_ptr;
}


int main()
{
	ConvertOpencvMatToArray();


	getchar();

	return 0;
}

2 使用C++模板将cv::Mat转换为std::vector

我们可以将第1节中的代码进行修改,不使用动态数组,而是改用使用std::vector,这样就不用太在意内存泄漏的问题。

我们可以写一个模板的方法完成cv::Mat与不同类型的std::vector之间的相互转换

template<typename _Tp>
std::vector<_Tp> convert_mat_to_vector(const cv::Mat& mat)
{
    //通道数不变,按行转为一行
    return (std::vector<_Tp>)(mat.reshape(1, 1));
}

template<typename _Tp>
cv::Mat convert_vector_to_mat(std::vector<_Tp> v, int channels, int rows)
{
    //将vector变成单列的mat,这里需要clone(),因为这里的赋值操作是浅拷贝
    cv::Mat mat = cv::Mat(v).clone();
    cv::Mat dest = mat.reshape(channels, rows);
    return dest;
}

使用的示例代码如下:

#include <iostream>
#include "opencv/cv.h"
#include "opencv2/opencv.hpp"

template<typename _Tp>
std::vector<_Tp> convert_mat_to_vector(const cv::Mat& mat)
{
    //通道数不变,按行转为一行
    return (std::vector<_Tp>)(mat.reshape(1, 1));
}

template<typename _Tp>
cv::Mat convert_vector_to_mat(std::vector<_Tp> v, int channels, int rows)
{
    //将vector变成单列的mat,这里需要clone(),因为这里的赋值操作是浅拷贝
    cv::Mat mat = cv::Mat(v).clone();
    cv::Mat dest = mat.reshape(channels, rows);
    return dest;
}

int main()
{
    cv::Mat img = cv::imread("a.jpg");
    std::vector<float> v = convert_mat_to_vector<float>(img);
    cv::Mat dest = convert_vector_to_mat<float>(v, 3, img.rows);

    cv::imwrite("b.jpg", dest);

    getchar();

    return 0;
}

有兴趣可以访问我的个人站:www.stubbornhuang.com文章来源地址https://www.toymoban.com/news/detail-637985.html

到了这里,关于OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中String和Char的相互转换

    用String.charAt()来让String类型转化为char类型,返回值是char,可以通过索引来指定元素位置。 使用String.toCharArray()来让String类型转化为char类型,返回值是char[],可以得到将包含整个String的char数组。这样我们就能够使用位置索引来确定string中的任意位置的元素。 1.转换效率最快的

    2024年02月13日
    浏览(35)
  • C语言中的char类型和int类型的相互转换

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植等特点。C语言中有多种数据类型,用来表示不同的数据和信息。本文将介绍C语言中的两种基本数据类型:char类型和int类型,以及它们之间的相互转换的方法和原理。 char类型是一种字符类型,用来表示单个字符,

    2024年02月03日
    浏览(40)
  • ffmpeg解码数据转换为cv::Mat

    ffmpeg解码数据转换为cv::Mat flyfish ffmpeg:ffmpeg-6.0 头文件 实现文件

    2024年02月12日
    浏览(29)
  • OpenCV buffer转cv::Mat

    void convertBuf2Mat(void* input_ptr, vx_uint32 width, vx_uint32 height, cv::Mat frame) {     // 计算亮度通道和色度通道的大小     size_t y_size = width * height;     size_t uv_size = y_size / 2;     // 创建一个只包含亮度通道的 cv::Mat 对象     cv::Mat y_channel(height, width, CV_8UC1, (unsigned char*)input_ptr);     // 设

    2024年02月07日
    浏览(25)
  • opencv学习(9):cv::Scalar、cv::Mat::zeros

            cv::Scalar是opencv的一个结构体,其定义如下:(c++中的结构体如下,可以存放1~4个数值。)         表示图像颜色时,单通道图像用下标[0]即可,三通道图像用下标[0]、[1]、[2]分别表示B、G、R通道         其中:                 白色:rgb(255,255,255)  

    2024年02月08日
    浏览(38)
  • 【debug】OpenCV出现问题:undefined reference to ‘cv::Mat::Mat()‘

    参考:动手学ROS2 分析原因: undefined reference to \\\'cv::Mat::Mat()\\\' 原因在于g++找不到库文件,解决方法就是我们帮助它定位到库文件的位置,并通过-L参数指定库目录,-l(小写L)指定库的名字。 解决方法: 在执行命令时添加后缀参数

    2024年02月08日
    浏览(35)
  • signed char 与 unsigned char 的取值范围

      🔗 《C语言趣味教程》👈  猛戳订阅!!! 在讲解数据类型前,我们不得不先讲解一些必备的知识点,比如如何定义一个变量,数据类型的基本概念。并介绍 ASCII 码,为 char 类型的讲解做必要的铺垫。然后讲解原码反码和补码,讲解 IEEE754标准时需要这部分的知识作为基

    2024年02月13日
    浏览(33)
  • [OpenCV][C++编程] cv::mat的定义与赋值

    可以通过在/目录下直接搜索opencv,确定opencv所在的目录: lopencv_core 是opencv的核心, -lopencv_highgui包含读取图像和显示图像的函数 -lopencv_imgproc包含图像处理函数(非机器学习方法),例如线性滤波,边缘检测、膨胀腐蚀、检测直线、仿射变换等等。 -lopencv_ml包含机器学习算法

    2024年02月09日
    浏览(34)
  • OpenCV:矩阵表达式:代数和cv::Mat

    OpenCV是一个强大的计算机视觉库,它提供了丰富的功能和工具,用于处理图像数据。在OpenCV中,矩阵是一种核心数据结构,而矩阵表达式则是一种强大的工具,用于在图像处理和计算机视觉任务中对矩阵进行代数运算。本文将深入探讨OpenCV中的矩阵表达式,以及它们与cv::Ma

    2024年01月19日
    浏览(27)
  • OpenCV中cv::Mat矩阵的四种遍历

    at方法遍历 单通道 运行结果 at方法遍历 多通道 (下面这种方式,既能遍历,又能修改) 运行结果: 对比程序:(下面这种方式,只能遍历,不能修改) 运行结果 第一种写法 运行结果 更一般的写法:把里面的3改成矩阵的通道数 a.channels() ,如下: 运行结果 上面这种写法

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包