opencv 中 Mat 数据结构的用法
假设MatA的维度是(i,j,k),现在想将它的(i,j,0)~(i,j,k-1)分别提取出来赋给A0~Ak,如何实现。{Rangesize(Range::all(),R...
假设Mat A的维度是 (i,j,k) ,现在想将它的 (i,j,0) ~ (i,j,k-1) 分别提取出来赋给A0~Ak,如何实现。
{
Range size(Range::all(),Range::all(),Range(0,1));
A0(Range::all(),Range::all())=A(size);
}
我试过了不行。。。。T_T
用一个三重循环倒是可以,可是程序运行太慢了,想提一下速。
opencv里面好多matlab的函数我都不知道是哪个,或者我该怎么查帮助文档呢?
万分感谢 展开
{
Range size(Range::all(),Range::all(),Range(0,1));
A0(Range::all(),Range::all())=A(size);
}
我试过了不行。。。。T_T
用一个三重循环倒是可以,可是程序运行太慢了,想提一下速。
opencv里面好多matlab的函数我都不知道是哪个,或者我该怎么查帮助文档呢?
万分感谢 展开
3个回答
推荐于2016-12-05 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464974
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
#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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
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);
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中
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1. 用循环就可以,什么会用到三重循环呢。。明明只在第三个维度上变化啊???
2. 怎么可能在opencv里查matlab的函数。。。
2. 怎么可能在opencv里查matlab的函数。。。
追问
1、我的问题就是不用循环怎么将A(i,j,0)的所有元素一次赋值到A0(i,j);
2、我的表述有问题,我想把matlab的代码转成opencv的,但是现在转完之后还没有在matlab中运行的快,因为我用的都是最耗时的循环的方法转的,我找不到opencv中对应的该用到的函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询