2013-04-12 44 views
5

Trong OpenCV nó phổ biến để truy cập một điểm ảnh trong một đối tượng Mat như vậy:mở CV chung chung Mat chức năng header

float b = A.at<float>(4,5); 

Vấn đề là, nếu bạn không biết loại dữ liệu apriori, bạn bị mắc kẹt. Có cách viết tiêu đề chức năng chung chấp nhận một Mat với loại mẫu T không? Tôi muốn tạo các hàm cho các phép tính đại số tuyến tính và tôi không muốn có mệnh đề if tách riêng doublefloat. Một cái gì đó như:

void func(Mat <T> a) { 
    a.at<T>(3,4) = ... 

Điều này có thể xảy ra trong OpenCV không?

Trả lời

1

Điều này có thể chỉ đơn giản bằng templating chức năng của bạn:

template<typename T> 
void func(Mat a) { 
    a.at<T>(3,4) = ... 

Nhưng lưu ý rằng bạn không có cách nào dễ dàng để hạn chế các loại T là chỉ đôi hoặc float, và thuật toán của bạn sẽ không thể làm việc trên khác các loại, nhưng nó có thể không phải là một vấn đề thực tế.

Cũng lưu ý những hạn chế của việc sử dụng các mẫu: What are the disadvantages of using templates?

+0

Mã này không biên dịch - bạn đã thử điều này hay bạn vừa đoán? – nbubis

+0

Tôi đã không đoán nhưng tôi phải thừa nhận rằng tôi đã không cố gắng để biên dịch nó xin lỗi, đã có một lỗi đánh máy bên trong chức năng. – zakinster

+0

Thực ra tôi không chú ý nhiều đến lớp Mat của openCV, tôi nghĩ đó là lớp Mat được nhắc đến như mã của bạn gợi ý nhưng nó thực sự chỉ là phương pháp, vì vậy lỗi đánh máy là cách khác. Bản chỉnh sửa cuối cùng sẽ được biên dịch về phía lớp openCV Mat. – zakinster

3

Nó xuất hiện thêm một cách để làm điều này sẽ được sử dụng đối tượng Mat_ thay vì Mat:

template<typename T> 
void func(Mat_ <T> a) { 
    cout << a(0,0) << endl; 
} 

Nếu bạn muốn vượt qua một Mat đến func, bạn phải chỉ định loại:

Mat a; 
func(Mat_<float>(a)); 

Nếu bạn u se loại differnt so với loại Mat gốc, OpenCV sẽ tạo sẵn chuyển đổi cho bạn.

1

OpenCV 2 Cookbook trang 40 cho rằng điều đó là không thể. Ngoài ra, liên quan đến Mat_:

"Sử dụng phương pháp của cv :: Lớp Mat đôi khi có thể cồng kềnh vì loại trả về phải được chỉ định làm đối số mẫu cho mỗi cuộc gọi. , nó có thể sử dụng các cv :: lớp Mat_ mà là một mẫu lớp con của cv :: Mat.

cv::Mat_<uchar> im2= image; // im2 refers to image 
im2(50,100)= 0; //access to row 50 and column 100 

Kể từ loại của cv :: Mat_ yếu tố được khai báo khi biến được tạo ra, phương thức toán tử() biết thời gian biên dịch để trả về. "

EDIT: Sử dụng Mat.type()

đầu ra
Mat image=imread("image.bmp"); 
cout<<image.type(); 

Console:

16 

Wiki: Phương pháp này trả về kiểu phần tử ma trận, một id, tương thích với các hệ thống kiểu CvMat , như CV_16SC3 hoặc mảng 3 kênh có ký hiệu 16 bit, v.v.

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