问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

opencv 中 Mat 数据结构的用法

发布网友 发布时间:2022-04-22 13:49

我来回答

3个回答

热心网友 时间:2022-04-18 15:32

#include "stdafx.h"

#include <string>
#include <iostream>

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int _tmain(int argc, _TCHAR* argv[])
{
//创建一个用1+3j填充的 7 x 7 复矩阵-----1
Mat M(7, 7, CV_32FC2, Scalar(1,3));

//现在将 M转换为100 x 60的CV_8UC(15)的矩阵,旧内容将会被释放
M.create(100, 60, CV_8UC(15));//不能为矩阵设置初值

//第 5行,乘以 3,加到第 3 行,
M.row(3) = M.row(3) + M.row (5) * 3;

//现在将第7列复制到第1列, M.col(1) = M.col(7);//这个不能实现,对列操作时要新建一个Mat
Mat M1 = M.col(1);
M.col(7).copyTo(M1);

//创建一种新的 320 x 240 图像-----2
Mat img(Size(320,240), CV_8UC3, Scalar::all(255));

string strWindowName = "ShowImage";

namedWindow(strWindowName, WINDOW_AUTOSIZE);
imshow(strWindowName, img);
waitKey(0);

//选择ROI(region of interest)
Mat roi(img, Rect(10, 10, 100, 100));

//填充 (0,255,0) 的ROI (这是RGB 空间中的绿色),320 x 240 原始图像将被修改
roi = Scalar(0, 255, 0) ;

imshow(strWindowName, img);
waitKey(0);

//获取数组中的子块-----3
Mat A = Mat::eye(10, 10, CV_32S);

//提取 A 的1 (含)到 3 (不包含)列
Mat B = A(Range::all(), Range(1, 3));

//提取 B 的5 (含)到 9 (不包含)行,即 C ~ A(Range(5,9),Range (1,3))
Mat C = B(Range(5, 9), Range::all());

Size size;
Point ofs;

C.locateROI(size, ofs);//使用locateROI() 计算子数组在主容器数组中的相对的位置
cout<<size.width<<" "<<size.height<<" "<<ofs.x<<" "<<ofs.y<<endl;

//快速初始化小矩阵-----4
double m[3][3] = {{1, 2, 3}, {1, 2, 5}, {3, 4, 6}};

Mat M2 = Mat(3, 3, CV_64F, m);//.inv();

Mat E = Mat::eye(4, 4, CV_64F);
cout<<"E = "<<endl<<" "<<E<<endl;

Mat O = Mat::ones(2, 2, CV_32F);
cout<<"O = "<<endl<<" "<<O<<endl;

Mat Z = Mat::zeros(3,3, CV_8UC1);
cout<<"Z = "<<endl<<" "<<Z<<endl;

//IplImage、Mat、CvMat互转-----5
IplImage *img1 = cvLoadImage("aa.jpg", 2 | 4);

Mat mtx(img1);//IplImage *-> Mat,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建一个Mat矩阵头// or : Mat mtx = img1;

CvMat oldmat = mtx;//Mat-> CvMat //只是创建矩阵头,而没有复制数据,oldmat不用手动释放

CV_Assert((oldmat.cols == img1->width) && (oldmat.rows == img1->height) && (oldmat.data.ptr == (uchar *)img1->imageData) && (oldmat.step == img1->widthStep));

imshow(strWindowName, mtx);
waitKey(0);

cvNamedWindow(strWindowName.c_str(), 0);
cvShowImage(strWindowName.c_str(), &oldmat);
cvWaitKey(0);

IplImage img2 = mtx;//Mat->IplImage //只是创建图像头,而没有复制数据,img2不用手动释放

cvShowImage(strWindowName.c_str(), &img2);
cvWaitKey(0);

Mat mat3(&oldmat);//CvMat->Mat

imshow(strWindowName, mat3);
waitKey(0);

cvDestroyWindow(strWindowName.c_str());
cvReleaseImage(&img1);

//创建 3 x 3 双精度恒等矩阵-----6
Mat M3 = (Mat_ <double>(3,3) <<1,0,0, 0,1,0, 0,0,1);

//访问数组元素-----7
M2.at<double>(0, 0) += 10.f;

double sum = 0;//计算元素和,方法一

for (int i=0; i<M2.rows; i++)
{
const double *Mi = M2.ptr<double>(i) ;

for (int j=0; j<M2.cols; j++)
{
sum += std::max(Mi[j], 0.);
}
}
cout<<sum<<endl;

sum = 0;//计算元素和,方法二

int cols =M2.cols, rows = M2.rows ;

if (M2.isContinuous())
{
cols *= rows;

rows = 1 ;
}

for (int i=0; i<rows; i++)
{
const double *Mi = M2.ptr <double>(i);

for (int j=0; j<cols; j++)
{
sum += std::max(Mi[j], 0.);
}
}
cout<<sum<<endl;

sum = 0;//计算元素和,方法三

MatConstIterator_<double> it = M2.begin<double>(), it_end = M2.end<double>();

for(; it != it_end; ++it)
{
sum += std::max(*it, 0.);
}
cout<<sum<<endl;

return 0;

}

热心网友 时间:2022-04-18 16:50

A0 = A.reshape(A.channels(),i*j).col(0).reshape(A.channels(),i);
A1 = A.reshape(A.channels(),i*j).col(1).reshape(A.channels(),i);
……
Ak = A.reshape(A.channels(),i*j).col(k).reshape(A.channels(),i);追问试了一下,好像3维的mat不能reshape吧(不是三通道)。。
目前我只会A.at(x,y,z)来访问单个元素,Mat对3维的支持是不是不太好啊…

追答刚查了下代码!确实不支持3维的reshape。抱歉!可以试着转成2维的再处理。

A0 = Mat(i * j, k, A.type(), A.data).col(0).clone().reshape(A.channels(), i);
A1 = Mat(i * j, k, A.type(), A.data).col(1).clone().reshape(A.channels(), i);
……
Ak = Mat(i * j, k, A.type(), A.data).col(k).clone().reshape(A.channels(), i);

A0 ~ Ak 中保存的是A的副本。对A0 ~ Ak的操作不会体现在A中

热心网友 时间:2022-04-18 18:24

1. 用循环就可以,什么会用到三重循环呢。。明明只在第三个维度上变化啊???
2. 怎么可能在opencv里查matlab的函数。。。追问1、我的问题就是不用循环怎么将A(i,j,0)的所有元素一次赋值到A0(i,j);

2、我的表述有问题,我想把matlab的代码转成opencv的,但是现在转完之后还没有在matlab中运行的快,因为我用的都是最耗时的循环的方法转的,我找不到opencv中对应的该用到的函数

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
武汉民政职业学院地址在哪里 全国有哪些民政学院 武汉民政学院 北京哪些区较好 北京哪个区环境好 北京海淀区属于什么档次 北京市哪个区最好 北京哪个区房子最好 递延是什么意思通俗 婚后是不是一定要自己买房子才可以结婚呢? opencv中MatExpr是什么类型与Mat有什么区别呢 opencv中Mat的数据定义为指向uchar 的指针,而构造函数又提供了许多其他类型 编程问题,某某的MAT指的是什么,比如opencv的mat等等 opencv 中mat类型对应的头文件是什么? 健康管理师2021年考试成绩 matnd 怎么转为 cvarr 健康管理师11月成绩什么时候出来? 404 Not Found 健康管理师证书下来了怎么查询? 怎么查自己的健康管理师证书 健康管理师如何进行成绩查询 健康管理师考完一般多长时间出成绩? 首都医科大学2021年5月30日健康管理师考试成绩查询 健康管理师多久出成绩? 健康管理师成绩查询? 健康管理师考试成绩查询 健康管理师如何查成绩? 健康管理师的成绩在什么网站查询? 举世闻名的近义词是什么 怎么用opencv把mat类型的数组绘制成二维直方图 如何使用opencv中mat文件 opencv Mat 多维矩阵如何创建 python opencv中有mat类型吗 如何对win10电脑文件进行加密 opencv 中 mat 的用法 肥肠需要煮多久才能熟 OpenCV 中 IplImage,CvMat,Mat中的type是怎么回事 opencv编程中cvMat到Mat如何进行数据转换? OpenCV中操作Mat的copy和clone的区别 肥肠需要煮多久才能熟? opencv中Mat和数组赋值的几种方法 win10文件夹怎么加密 肥肠煮多久 opencv 中Mat pointsf是什么意思 生肥肠一般要煮多久就熟? win10系统怎么加密文件夹 python opencv 表示mat类型吗 肥肠一般要煮多少时间