Kích thước của ma trận OpenCV


128

Tôi biết điều này có thể rất thô sơ, nhưng tôi chưa quen với OpenCV. Bạn có thể vui lòng cho tôi biết làm thế nào để có được kích thước của ma trận trong OpenCV không?. Tôi googled và tôi vẫn đang tìm kiếm, nhưng nếu bất kỳ ai trong số các bạn biết câu trả lời, xin vui lòng giúp tôi.

Kích thước như số lượng hàng và cột.

Và có cách nào để trực tiếp lấy giá trị tối đa của ma trận 2D không?

Câu trả lời:


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

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

Cũng lưu ý rằng sải chân> = cols; điều này có nghĩa là kích thước thực tế của hàng có thể lớn hơn kích thước phần tử x cols. Điều này khác với vấn đề Mat liên tục và liên quan đến căn chỉnh dữ liệu.



1
Là hai tương đương chính xác?
Cacahuete Frito

19

Lưu ý rằng ngoài các hàng và cột còn có một số kênh và loại. Khi rõ loại này là gì, các kênh có thể hoạt động như một thứ nguyên bổ sung như trong CV_8UC3, do đó bạn sẽ giải quyết một ma trận như

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

Vì vậy, kích thước về các yếu tố của loại cơ bản là M.bow * M.cols * M.cn

Để tìm phần tử tối đa người ta có thể sử dụng

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

Đây là câu trả lời duy nhất cũng giải quyết việc tìm phần tử lớn nhất trong Mat OpenCV.
rayryeng

12

Đối với ma trận 2D:

mat.rows - Số lượng hàng trong một mảng 2D.

mat.cols - Số lượng cột trong một mảng 2D.

Hoặc: C ++: Kích thước Mat :: size () const

Phương thức trả về kích thước ma trận: Kích thước (cols, hàng). Khi ma trận lớn hơn 2 chiều, kích thước được trả về là (-1, -1).

Đối với ma trận đa chiều, bạn cần sử dụng

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;

Lưu ý, ở đây 2 cho trục z, 3 cho trục y, 4 cho trục x. Theo x, y, z, nó có nghĩa là thứ tự của các kích thước. chỉ số x thay đổi nhanh nhất.


1
chỉ cần rõ ràng, không có Mat::size()phương thức thành viên, thay vào đó là một Mat::sizebiến thành viên của kiểu MatSize. Cái sau làm quá tải toán tử dấu ngoặc đơn MatSize::operator()để trả về một Sizeđối tượng
Amro

4

Một ví dụ mã C ++ hoàn chỉnh, có thể hữu ích cho người mới bắt đầu

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

1
Làm thế nào để chúng ta có được độ sâu của ma trận trong cpp?
sai

1

Nếu bạn đang sử dụng trình bao bọc Python, thì (giả sử tên ma trận của bạn là mat ):

  • mat.shape cung cấp cho bạn một mảng thuộc loại- [chiều cao, chiều rộng, kênh]

  • mat.size cung cấp cho bạn kích thước của mảng

Mã mẫu:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.size
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.