4

我正在使用 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。我不确定这是否正确。

4

5 回答 5

2
Mat m;
m.row(i);
m.col(i);

参考: 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;
}    
于 2013-06-09T11:54:02.357 回答
1

上面的所有建议都没有帮助,所以我决定创建一个具有 Mat 数据类型的临时变量,并将向量的第 0 个索引复制到 Mat temp 并以 temp.cols 和 temp.rows 的形式访问 temp 的行和列。谢谢你的尝试帮助我。

于 2013-06-09T13:32:07.417 回答
1

成员rowscols告诉您矩阵的行数和列数。要访问它们,您可以使用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;
    ...
  }
}
于 2013-06-09T12:14:32.813 回答
0

Mat已经是图像的向量。因此,您不需要将其定义为 Vector 有了它,images.cols您只会获得列数或行数。如果你想访问特定列和行中的数据,你应该这样做:

int mat_value = image.get(i, j)[0];

其中 i 和 j 是您的列和行的索引。

编辑: 或者,您可以通过以下方式查看图像的列和行数

int cols = image.size().width;
int rows = image.size().height;

PS 我认为它在 OpenCV 文档中得到了很好的解释。

于 2013-06-09T11:48:08.463 回答
0

由于 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;
  }
}

如果要存储这些值,可以使用数组。

于 2019-02-14T03:11:10.817 回答