如何访问Vector的行和列 Open cv for Android的图片?

问题描述 投票:4回答:5

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

android opencv vector rows mat
5个回答
2
投票

成员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;
    ...
  }
}

1
投票
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;
}    

1
投票

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


0
投票

Mat已经是一个图像的矢量。因此,您不需要将其定义为向量使用此images.cols,您只获得列数或行数。如果要访问特定列和行中的数据,则应该这样执行:

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

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

编辑:或者您可以看到图像的列和行的编号方式

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

附:我认为在OpenCV文档中有很好的解释。


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

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

© www.soinside.com 2019 - 2024. All rights reserved.