2012-09-11 41 views
7

theo điều này post và từ tài liệu OpenCV, tôi có thể khởi tạo và truy cập từng phần tử của Mat đa chiều.truy cập ma trận phụ của Mat đa chiều trong OpenCV

Thực ra, trước hết tôi được mã hóa bằng MATLAB và bây giờ cần chuyển đổi sang OpenCV. Ma trận MATLAB hỗ trợ truy cập ma trận phụ như: a (:,:, 3) hoặc b (:,:, 3: 5)

Điều này có thể thực hiện trong OpenCV không? theo như tôi biết, điều này có thể được thực hiện với 2D Mat. Làm thế nào về nhiều hơn mà 2D ??

Chỉnh sửa01: hơn nữa, với Mat đa chiều, các thuộc tính cols và các hàng không đủ để mô tả 3 kích thước của ma trận. Có những trường hợp có kích thước lớn hơn 3. Cách lưu trữ các thuộc tính này?

Edit02:

// create a 100x100x100 8-bit array 
int sz[] = {100, 100, 100}; 
Mat bigCube(3, sz, CV_8U, Scalar::all(0)); 

tôi từ bỏ ý tưởng tiếp cận tiểu ma trận với OpenCV Mát. Có lẽ, nó không được hỗ trợ trong OpenCV. Nhưng từ mã mẫu này, hàm tạo nhận thứ nguyên thứ 3 từ 'sz'. Tài sản nào của Mat chiều thứ 3 này được chuyển đến? có lẽ trong trường hợp này, hàng = 100, cols = 100, cái kia ?? = 100 Tôi bị mất với tài liệu OpenCV

Edit03: theo dõi lớp Mat từ nguồn OpenCV tôi đã tìm thấy định nghĩa của các nhà xây dựng trong Edit02 từ mat.hpp:

inline Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s) 
    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0), 
    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows) 
{ 
    create(_dims, _sz, _type); 
    *this = _s; 
} 

câu hỏi tiếp theo là ở đâu và làm thế nào "tạo" chức năng ở đây được xác định? => truy tìm định nghĩa Mat này trong OpenCV có thể giúp tôi sửa đổi/tùy chỉnh các tính năng của riêng mình trong Mat matrix

PS: xin lỗi nếu bài viết của tôi được viết quá lộn xộn !! Tôi là một lập trình viên mới, cố gắng giải quyết vấn đề lập trình của tôi. Plz cảm thấy tự do để sửa tôi nếu cách tiếp cận của tôi là không tốt hoặc phải đủ. Cảm ơn bạn!!

+0

Tôi đã core.hpp để xem tất cả các khai báo của hàm tạo, bao gồm cả một đối với Mat đa chiều. Nhưng tôi không thể tìm thấy định nghĩa, ý tôi là mã hóa của hàm tạo đó, để xem thuộc tính thứ nguyên thứ ba đi tới đâu. Mã nguồn đó ở đâu ?? –

+0

Điều đó sẽ có: /modules/core/src/matrix.cpp. Tôi đang chỉnh sửa câu trả lời của tôi liên quan đến vấn đề ban đầu của bạn bên dưới – remi

+0

Bạn có viết mã này không? Tôi sắp phải làm điều tương tự ... – kmac

Trả lời

6

Bạn có thể dễ dàng truy cập vào tiểu ma trận 2D cv :: Mat sử dụng chức năng rowRange, colRange hoặc thậm chí

cv::Mat subMat = originalMat(cv::Rect(x,y,width,height)); 

Ngoài ra, số lượng các kênh truyền hình trong một ma trận, mà bạn có thể xác định trong các nhà xây dựng ma trận, có thể được sử dụng như kích thước thứ ba (nhưng nó được giới hạn ở 256 hoặc 512 tôi nghĩ).

Ngoài ra còn có các cv templated :: Mat_ lớp mà bạn có thể thích ứng để phù hợp với mục đích của bạn

[sửa]

Tôi đã kiểm tra các nhà xây dựng cho> 2 ma trận chiều. Khi bạn chạy nó, các hàng và cols của Mat được đặt thành -1. Kích thước ma trận thực tế được lưu trữ trong Mat :: size như một mảng int. Đối với ma trận các tham số> 2, bạn không thể sử dụng các hàm tạo con đường phụ bằng cách sử dụng cv :: Rect hoặc rowRange/colRange.

Tôi e rằng bạn phải làm một chút công việc để trích xuất các ngôn ngữ phụ cho mờ> 2, làm việc trực tiếp với dữ liệu hàng. Nhưng bạn có thể sử dụng thông tin được lưu trữ trong Mat :: bước cho bạn biết cách bố trí của mảng. Điều này được giải thích trong số official documentation.

+0

.. vậy bạn có nghĩa là, tôi nên viết các chức năng riêng biệt để thực hiện kiểu truy cập ma trận này? hoặc thêm chúng vào lớp Mat bằng cách viết myMat chẳng hạn ?? Đây là một câu hỏi ngớ ngẩn, nhưng với tư cách là một lập trình viên nghiệp dư, tôi thực sự muốn biết mọi thứ được thực hiện như thế nào theo cách chuyên gia –

+0

Các chuyên gia chỉ cố gắng làm những việc làm :) Trong trường hợp của bạn có thể hữu ích khi viết một hàm để truy cập Dữ liệu N chiều. Tôi sẽ không bận tâm viết một lớp mới. – remi

+0

Tôi không muốn đóng bài đăng này vì tôi muốn hoàn thành nó bằng cách viết lớp/chức năng của riêng tôi và đăng chúng ở đây như một bài tập. Vì vậy, xin lỗi vì điều đó :) –

Các vấn đề liên quan