项目
|
下属项目
|
测试用例数量
|
目的
|
无
|
0
|
代码
|
无
|
1
|
在openCV的应用中,我们获取图像的矩阵信息很简单。但是我们可能想调用其他的矩阵运算库(比如Eigen库)来进行计算。那么我们就需要把openCV读取到的类型(比如Mat类型)的矩阵信息传递到另外类型(比如Eigen库的MatrixXd类型)的矩阵。这该怎么办呢?由于目前在网络上搜不到特别符合楼主意愿的答案,故写此博客,希望能够帮助到同楼主一样徜徉在信息海洋里的各位!
只要您配置了openCV库,那么直接拷贝下面这段代码,稍加修改读取图片路径即可马上运行。
参考以下代码:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
void main()
int i = 0, j = 0;
Mat img = imread("F:\\photoCollection\\flowergirl.png", 0);
int row = img.rows;
int col = img.cols;
namedWindow("原图");
imshow("原图", img);
Mat img2 = Mat(row, col, CV_8UC1);
uchar **ptr = (uchar **)malloc(row*sizeof(uchar *));
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);
for (j = 0; j < col; j++)
ptr[i][j] = img.at<uchar>(i, j);
ptmp[j] = ptr[i][j];
namedWindow("新图");
imshow("新图", img2);
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;