2013-07-27 119 views
9

Tôi đã cố gắng để đạt được điều gì đó đáng lẽ không đáng kể và là tầm thường trong Matlab.Opencv nhân vô hướng và ma trận

Tôi muốn chỉ đơn giản là đạt được một cái gì đó như:

cv::Mat sample = [4 5 6; 4 2 5; 1 4 2]; 
sample = 5*sample; 

Sau đó mẫu chỉ nên là:

[20 24 30; 20 10 25; 5 20 10] 

Tôi đã thử scaleAdd, Mul, Multiply và không cho phép một số nhân vô hướng và yêu cầu một ma trận cùng "kích thước và loại". Trong trường hợp này, tôi có thể tạo một Ma trận và sau đó sử dụng tham số tỷ lệ nhưng dường như rất không liên quan

Bất kỳ phương pháp đơn giản trực tiếp nào đều tuyệt vời!

+1

nên không '24' được '25' thay ??? : P – herohuyongtao

Trả lời

14

OpenCV thực tế hỗ trợ phép nhân bằng giá trị vô hướng với quá tải operator*. Bạn có thể cần phải khởi tạo ma trận một cách chính xác, mặc dù.

float data[] = {1 ,2, 3, 
       4, 5, 6, 
       7, 8, 9}; 
cv::Mat m(3, 3, CV_32FC1, data); 
m = 3*m; // This works just fine 

Nếu bạn chủ yếu quan tâm đến các hoạt động toán học, cv::Matx là một chút dễ dàng hơn để làm việc với:

cv::Matx33f mx(1,2,3, 
       4,5,6, 
       7,8,9); 
mx *= 4; // This works too 
+2

Chức năng này chỉ hoạt động đối với các hình ảnh được truyền một kênh. Điều này do đó không hoạt động nói chung. Bạn sẽ phải chia tất cả các kênh trước và sau đó kết hợp lại, ví dụ: \t // (3) Chia hình ảnh RGB \t vector imgPlanes (3); \t tách (matImage, imgPlanes); \t Mat matImageK = imgPlanes [0]; – TimZaman

1

một cái gì đó như thế này.

Mat m = (Mat_<float>(3, 3)<< 
        1, 2, 3, 
        4, 5, 6, 
        7, 8, 9)*5; 
0
Mat A = //data;//source Matrix 
Mat B;//destination Matrix 
Scalar alpha = new Scalar(5)//factor 
Core.multiply(A,alpha,b); 
0

Đối với java không có điều hành quá tải, nhưng đối tượng Mat cung cấp chức năng với một phương pháp ConvertTo.

Mat dst= new Mat(src.rows(),src.cols(),src.type()); 
src.convertTo(dst,-1,scale,offset); 

Doc on this method is here

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