我正在使用Android在open cv上查看一些代码。任何人都可以告诉我如何访问图像矢量Mat的行和列?它已声明,并且如下所示访问列和行但我有错误喜欢和。
vector<Mat> images;//Vector of Mat image declared
...
int im_width = images[0].cols;//its trying to access column of images matrix
int im_height = images[0].rows;//trying to access rows of Mat images
如果这不是访问矢量图像的列和行的正确方法,那么它是什么?当它说images [0]它试图访问Mat图像矢量的索引0时。我不确定这是否正确。
成员rows
和cols
告诉你矩阵的行数和列数。要访问它们,您可以使用at
:
// let's assume your image is CV_8U, so that it is accessed with unsigned char
cv::Mat m = ...;
for(int r = 0; r < m.rows; ++r)
{
for(int c = 0; c < m.cols; ++c)
{
char byte = m.at<unsigned char>(r, c);
...
}
}
您还可以保存对at
的一些调用,并通过每行的指针访问数据:
// let's assume your image is CV_8U, so that it is accessed with unsigned char
cv::Mat m = ...;
for(int r = 0; r < m.rows; ++r)
{
const unsigned char *p = m.ptr<unsigned char>();
for(int c = 0; c < m.cols; ++c, ++p)
{
char byte = *p;
...
}
}
如果矩阵在内存中是连续的,你可以只获得一次指针:
// let's assume your image is CV_8U, so that it is accessed with unsigned char
cv::Mat m = ...;
assert(m.isContinuous());
const unsigned char *p = m.ptr<unsigned char>();
for(int r = 0; r < m.rows; ++r)
{
for(int c = 0; c < m.cols; ++c, ++p)
{
char byte = *p;
...
}
}
Mat m;
m.row(i);
m.col(i);
ref:http://opencv.willowgarage.com/wiki/Welcome?action=AttachFile&do=get&target=opencv_cheatsheet.pdf
编辑:以下工作并产生预期的输出。也许你应该描述你的错误?
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
vector<Mat> vectors;
Mat img1 = imread( "C:/test/1.jpg");
Mat img2 = imread( "C:/test/2.jpg");
vectors.push_back(img1);
vectors.push_back(img2);
cout<<vectors[0].rows<<endl;
cout<<vectors[0].cols<<endl;
cin.ignore(1);
return 0;
}
上面的所有建议都没有帮助,所以我决定用Mat数据类型创建一个临时变量,并将向量的第0个索引复制到Mat temp,并访问temp的行和列作为temp.cols和temp.rows.Thanks进行尝试虽然帮助我。
Mat
已经是一个图像的矢量。因此,您不需要将其定义为向量使用此images.cols
,您只获得列数或行数。如果要访问特定列和行中的数据,则应该这样执行:
int mat_value = image.get(i, j)[0];
其中i和j是列和行的索引。
编辑:或者您可以看到图像的列和行的编号方式
int cols = image.size().width;
int rows = image.size().height;
附:我认为在OpenCV文档中有很好的解释。
由于Mat已经是图像的矢量,因此您无需再次定义矢量。你需要做的就是,
Mat images;
for(int j =0; j <images.rows; j++)
{
for(int k =0; k <images.cols; k++)
{
cout << image.at<type>(j,k)<< endl;
}
}
如果要存储这些值,可以使用数组。