Ukuran dari Matrix OpenCV

128

Saya tahu ini mungkin sangat sederhana, tetapi saya baru di OpenCV. Bisakah Anda memberi tahu saya cara mendapatkan ukuran matriks di OpenCV ?. Saya mencari di Google dan saya masih mencari, tetapi jika ada dari Anda yang tahu jawabannya, tolong bantu saya.

Ukuran seperti dalam jumlah baris dan kolom.

Dan apakah ada cara untuk secara langsung mendapatkan nilai maksimum dari matriks 2D?

Lakshmi Narayanan
sumber

Jawaban:

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

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

Perhatikan juga bahwa langkah> = cols; ini berarti bahwa ukuran aktual baris dapat lebih besar dari ukuran elemen x cols. Ini berbeda dari masalah Mat berkelanjutan dan terkait dengan penyelarasan data.

Michael O
sumber
1
Apakah kedua persamaan itu tepat?
Cacahuete Frito
19

Perhatikan bahwa selain baris dan kolom ada sejumlah saluran dan jenis. Ketika sudah jelas apa jenisnya, saluran dapat bertindak sebagai dimensi ekstra seperti pada CV_8UC3 sehingga Anda akan mengatasi matriks sebagai

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

Jadi ukuran dalam hal elemen tipe dasar adalah M.rows * M.cols * M.cn

Untuk menemukan elemen maks yang dapat digunakan

Mat src;
double minVal, maxVal;
minMaxLoc(src, &minVal, &maxVal);
Vlad
sumber
Ini adalah satu-satunya jawaban yang juga membahas menemukan elemen terbesar dalam Mat OpenCV.
rayryeng
12

Untuk matriks 2D:

mat.rows - Jumlah baris dalam array 2D.

mat.cols - Jumlah kolom dalam array 2D.

Atau: C ++: Ukuran Mat :: size () const

Metode mengembalikan ukuran matriks: Ukuran (cols, baris). Ketika matriks lebih dari 2 dimensi, ukuran yang dikembalikan adalah (-1, -1).

Untuk matriks multidimensi, Anda perlu menggunakan

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;

Catatan, di sini 2 untuk sumbu z, 3 untuk sumbu y, 4 untuk sumbu x. Dengan x, y, z, itu berarti urutan dimensi. x indeks mengubah tercepat.

pengguna1914692
sumber
1
hanya untuk menjadi jelas, tidak ada Mat::size()metode anggota, melainkan Mat::sizevariabel anggota tipe MatSize. Yang terakhir kelebihan beban operator kurung MatSize::operator()untuk mengembalikan Sizeobjek
Amro
4

Contoh kode C ++ lengkap, mungkin bermanfaat untuk pemula

#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;
}
MD. Nazmul Kibria
sumber
1
bagaimana kita mendapatkan kedalaman matriks dalam cpp?
Sai
1

Jika Anda menggunakan pembungkus Python, maka (dengan asumsi nama matriks Anda adalah mat ):

  • mat.shape memberi Anda array tipe- [tinggi, lebar, saluran]

  • mat.size memberi Anda ukuran array

Kode sampel:

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