ขนาดของ Matrix OpenCV


128

ฉันรู้ว่านี่อาจเป็นพื้นฐาน แต่ฉันใหม่กับ OpenCV คุณช่วยบอกวิธีรับขนาดเมทริกซ์ใน OpenCV ได้ไหม ฉัน googled และฉันยังคงค้นหา แต่ถ้ามีใครรู้คำตอบโปรดช่วยฉัน

ขนาดเท่าจำนวนแถวและคอลัมน์

และมีวิธีในการรับค่าสูงสุดของเมทริกซ์ 2D โดยตรงหรือไม่

คำตอบ:


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

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

โปรดทราบด้วยว่า stride> = cols; นี่หมายความว่าขนาดที่แท้จริงของแถวสามารถมากกว่าขนาดองค์ประกอบ x cols สิ่งนี้แตกต่างจากเรื่องของ Mat ต่อเนื่องและเกี่ยวข้องกับการจัดตำแหน่งข้อมูล


10
เชื่อมโยงไปยังเอกสาร: docs.opencv.org/modules/core/doc/basic_structures.html#mat-size
Rasim

1
สองสิ่งนี้เทียบเท่ากันจริงหรือ
Cacahuete Frito

19

โปรดทราบว่านอกเหนือจากแถวและคอลัมน์มีจำนวนช่องและประเภท เมื่อชัดเจนประเภทคือช่องทางสามารถทำหน้าที่เป็นมิติพิเศษเช่นเดียวกับใน CV_8UC3 ดังนั้นคุณจะอยู่เมทริกซ์เป็น

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

ดังนั้นขนาดในแง่ขององค์ประกอบประเภทประถมศึกษาคือ M.rows * M.cols * M.cn

ในการค้นหาองค์ประกอบสูงสุดที่สามารถใช้ได้

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

นี่เป็นคำตอบเดียวที่ให้การค้นหาองค์ประกอบที่ใหญ่ที่สุดใน OpenCV Mat
rayryeng

12

สำหรับเมทริกซ์ 2D:

mat.rows - จำนวนแถวในอาร์เรย์ 2D

mat.cols - จำนวนคอลัมน์ในอาร์เรย์ 2D

หรือ: C ++: Size Mat :: size () const

วิธีการคืนขนาดเมทริกซ์: ขนาด (cols, แถว) เมื่อเมทริกซ์มากกว่า 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;

หมายเหตุที่นี่ 2 สำหรับแกน z, 3 สำหรับแกน y, 4 สำหรับแกน x โดย x, y, z มันหมายถึงลำดับของมิติ ดัชนี x เปลี่ยนเร็วที่สุด


1
เพียงเพื่อให้มีความชัดเจนไม่มีMat::size()วิธีสมาชิกค่อนข้างตัวแปรสมาชิกประเภทMat::size MatSizeหลังโอเวอร์โหลดตัวดำเนินการวงเล็บMatSize::operator()เพื่อส่งคืนSizeวัตถุ
Amro

4

ตัวอย่างรหัส 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;
}

1
เราจะทำให้ความลึกของเมทริกซ์เป็น cpp ได้อย่างไร?
Sai

1

หากคุณใช้ตัวห่องูหลามด้วย (สมมติว่าชื่อเมทริกซ์ของคุณคือแผ่น ):

  • mat.shapeให้อาเรย์ของประเภท - [ความสูงความกว้างช่อง]

  • mat.sizeให้ขนาดของอาร์เรย์

รหัสตัวอย่าง:

import cv2
mat = cv2.imread('sample.png')
height, width, channel = mat.shape[:3]
size = mat.size
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.