web-dev-qa-db-ja.com

マトリックスOpenCVのサイズ

これは非常に初歩的なことかもしれませんが、私はOpenCVには初めてです。 OpenCVで行列のサイズを取得する方法を教えてください。私はグーグルで、まだ探していますが、もし誰かが答えを知っていたら私を助けてください。

行数と列数で表したサイズ。

そして、2D行列の最大値を直接取得する方法はありますか?

111
cv:Mat mat;
int rows = mat.rows;
int cols = mat.cols;

cv::Size s = mat.size();
rows = s.height;
cols = s.width;

またストライド> = colsに注意してください。これは、行の実際のサイズが要素サイズx colsより大きくなる可能性があることを意味します。これは継続的なMatの問題とは異なり、データの配置に関連しています。

215
Michael O

行と列とは別に、いくつかのチャンネルとタイプがあります。タイプが明確な場合、チャンネルはCV_8UC3のように追加の次元として機能するため、次のように行列を指定します。

uchar a = M.at<Vec3b>(y, x)[i];

したがって、基本型の要素に関するサイズは、Mrows * M.cols * M.cnです。

最大要素を見つけるには、次のものを使用できます。

Mat src;
double minVal, maxVal;
minMaxLoc(src, &minVal, &maxVal);
18
Vlad

2D行列の場合:

mat.rows - 2次元配列の行数です。

mat.cols - 2次元配列の列数.

または、C++:Size Mat :: size()const

このメソッドは行列のサイズを返します。Size(cols、rows)。行列が2次元を超える場合、返されるサイズは(-1、-1)です。

多次元行列の場合は、つぎのものを使う必要があります。

int thisSizes[3] = {2, 3, 4};
cv::Mat mat3D(3, thisSizes, CV_32FC1);
// mat3D.size tells the size of the matrix 
// mat3D.size[0] = 2;
// mat3D.size[1] = 3;
// mat3D.size[2] = 4;

ここで、z軸は2、y軸は3、x軸は4です。 x、y、zによって、それは次元の順序を意味します。 x indexが最も早く変わります。

10
user1914692

完全なC++コードの例は、初心者には役に立つかもしれません

#include <iostream>
#include <string>
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

int main()
{
    cv:Mat M(102,201,CV_8UC1);
    int rows = M.rows;
    int cols = M.cols;

    cout<<rows<<" "<<cols<<endl;

    cv::Size sz = M.size();
    rows = sz.height;
    cols = sz.width;

    cout<<rows<<" "<<cols<<endl;
    cout<<sz<<endl;
    return 0;
}
4

あなたがpythonを使っているなら、(もしあなたの行列名がmatなら):mat.shape - あなたに - [height、width、channels] - の型の配列を与えます - mat.size - 配列のサイズを指定します。サンプルコード:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.size
0
nimesh00