项目 下属项目 测试用例数量
目的 0
代码 1

在openCV的应用中,我们获取图像的矩阵信息很简单。但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算。那么我们就需要把openCV读取到的类型(比如Mat类型)的矩阵信息传递到另外类型(比如Eigen库的MatrixXd类型)的矩阵。这该怎么办呢?由于目前在网络上搜不到特别符合楼主意愿的答案,故写此博客,希望能够帮助到同楼主一样徜徉在信息海洋里的各位! 1

只要您配置了openCV库,那么直接拷贝下面这段代码,稍加修改读取图片路径即可马上运行。
参考以下代码:

//2018.1.19_21:09 by Cooper Liu
//Questions? Contact me: angelpoint@foxmail.com
//本程序为C++工程,编译环境需要配置openCV
#include <iostream>  
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
//#include<opencv2/opencv.hpp>//如果要包含所有库
using namespace cv;
void main()
	//这一段程序实现:图像img -> ptr[][] -> 图像img2 的传递过程,即图像->二维数组->图像
	int i = 0, j = 0;
	Mat img = imread("F:\\photoCollection\\flowergirl.png", 0);//读取图像img。0表示转换为灰度图像读入
	int row = img.rows;
	int col = img.cols;
	namedWindow("原图");
	imshow("原图", img);
	Mat img2 = Mat(row, col, CV_8UC1);//图像img2:row*col大小
	uchar **ptr = (uchar **)malloc(row*sizeof(uchar *));//二维数组ptr[][]
	for (i = 0; i < row; i++)
		ptr[i] = (uchar *)malloc(col*sizeof(uchar));
	uchar *ptmp = NULL;//这是关键的指针!!
	for (i = 0; i < row; i++)
		ptmp = img2.ptr<uchar>(i);//指针指向img2的第i行
		for (j = 0; j < col; j++)
			ptr[i][j] = img.at<uchar>(i, j);//img的矩阵数据传给二维数组ptr[][]
			ptmp[j] = ptr[i][j];//二维数组数据传给img2的第i行第j列
	namedWindow("新图");
	imshow("新图", img2);
	// 等待100000 ms后窗口自动关闭    
	waitKey(100000);

以上代码部分的关键在于指针ptmp的应用,在openCV的配置下,目前是不允许直接用 .at 去给Mat类型的数据赋值的。

个人运行截图如下:

如果本文有帮助到你,不如请我一罐可乐吧 🎃
在这里插入图片描述

  • openCV图像矩阵Mat和二维数组的互相转换
  • 一个RGB32的像素,总共占32位,R,G,B分别占8位,还有一个空8位不用,可以用Vec3b获取RGB32像素值。一个ARGB32的像素,总共占32位,R,G,B,A分别占8位,可以用Vec4b获取ARGB32像素值。C----代表通道数,C3表示3通道,没加默认位单通道。CV_32S-有符号32位整数(-2147483648-2147483647)CV_16S-有符号16位整数(-32768-32767)CV_8S-有符号8位整数(-128-127) 1、ndarray转换matriximport numpy as np from numpy import random,matr_arr=random.rand(4,4) print('r_arr',r_arr) r_mat=mat(r_arr) print(r_mat.I)#求逆运行结果:r_arr [[ 0.65603592 0.39908438 0.44722351 0.926527 import cv2 a = cv2.imread(filenames,cv2.IMREAD_GRAYSCALE) #读取图片,第二个参数表示以灰度图像读入 cv2.imread的返回值是array. 获取图像尺寸使用 h = a.shape[0]; w = a.shape[1]; 二、图像显示 import cv2 a = cv2.imread(filenames,cv2.IMREAD_GRAYSCALE) #读取图片,第二个参数表示以灰度图像读入 cv2.ims.   cv::Mat使用构造函数可以从二维数组构建Mat对象OpenCV笔记-Mat类型;   二维数组是各种类型(char、short、long、float、double)的内存数据;   项目中常见放置灰度图的数组转换为cv::Mat图像Mat2Buffer void Mat2Buffer(const cv::Mat &img, unsigned char *&output) // Mat图像总的字节 int nBytes = img.rows * img.cols * img 由于曾经做过一些嵌入式的图像处理算法,感觉在单片机上做算法开发和验证非常麻烦,想在PC机上实现后直接移植到单片机即可,所以创建了这个专栏,学习一下图像处理算法。嵌入式的图像处理算法的开发中,图像数据一般都是存储在数组中,而在电脑上常用的图像处理库是OpenCV,其数据存储在Mat类中,故第一步应该实现这两种数据的互转。完成上述步骤的作用是为了将Mat类型转为嵌入式中常见的数组类型,在PC端上设计出图像处理算法,然后就可以直接移植到嵌入式芯片即可,降低开发难度。 通常情况下,在同一个opencv项目传递cv::Mat可直接通过const cv::Mat& img这种方式传递,但是如果需要进行跨语言传递,比如C++传递到C#或者C#传递到C++,那么通常这种情况下需要将cv::Mat转换为内存指针比如unsigned char指针或者float指针进行传递。我们可以将第1节中的代码进行修改,不使用动态数组,而是改用使用std::vector,这样就不用太在意内存泄漏的问题。我们可以写一个模板的方法完成cv::Mat与不同类型的std::vector之间的相互转换。 今天用python opencv 函数 cv2.imread加载图像图像是单通道的但是加载完之后就变成三通到了。处理了半天的bug才发现是这里出现了问题。 介绍一下imread函数: c++函数模型 #include <opencv2/imgcodecs.hpp> Mat cv::imread(const String & filename,int flags = IMREAD_COLOR ) import cv2 image= cv2.imread( filename,[fla 以一个256*256的二维数组为例,将其转化为bitmap图像显示,代码如下 Mat mat = Mat.zeros(255,255, CvType.CV_8UC1); int[][] arr= new int[256][256]; for(int i=0;i<256;i++){ for(int j=0;j<256;j++){ arr[i][j] = j;