2011-10-28 33 views
5

Làm thế nào để chuyển đổi một OpenCV cv::Mat thành một float* có thể được đưa vào Vlfeat vl_dsift_process? Tôi không thể hiểu cách vl_dsift_process hoạt động trên mảng float một chiều. Các mẫu chính thức chỉ minh họa cách sử dụng API MatLab. Dường như không có mẫu về C API và đầu mối duy nhất là tệp MEX trong gói nguồn.Làm thế nào để chuyển đổi một OpenCV cv :: Mat thành một float * có thể được đưa vào Vlfeat vl_dsift_process?

+0

Có thể vấn đề này liên quan đến cách ma trận được chuyển từ Matlab sang C? –

Trả lời

11

float* matData = (float*)myMat.data;

Hãy chắc chắn rằng ma trận sẽ không bị xóa/đi ra khỏi phạm vi trước khi kết thúc bằng cách sử dụng con trỏ đến dữ liệu. Và đảm bảo ma trận chứa phao.

+1

Ma trận cần được kiểm tra để liên tục, nếu không nó sẽ không được hiểu là mảng một chiều. Và tôi nghĩ rằng nó thích hợp hơn để sử dụng 'reinterpret_cast' ở đây vì nó cho thấy rõ ràng tính chất nguy hiểm của dàn diễn viên này. Dù sao, việc trích xuất DSIFT có thể sẽ chậm hơn nhiều so với chuyển đổi ma trận sang 'vector ', vì vậy tôi nghĩ rằng chi phí liên quan là không đáng kể và đáng giá thêm độ an toàn và tính di động. – lizarisk

4

Tôi không thể hiểu tác phẩm như thế nào vl_dsift_process trên một mảng float một chiều

DSIFT hy vọng một hình ảnh màu xám nơi intensivity của pixel (x, y) được lưu trữ trong float_array [y * chiều rộng + x] như giá trị float. Trong các hình ảnh OpenCV được lưu trữ dưới dạng ký tự không dấu nên chuyển đổi đơn giản của Mat :: dữ liệu thành float * sẽ không hoạt động. Bạn phải chuyển đổi thủ công mọi giá trị thành phao:

Mat mat = imread("image_name.jpg", 0); // 0 stands for grayscale 

vector<float> img; 
for (int i = 0; i < mat.rows; ++i) 
    for (int j = 0; j < mat.cols; ++j) 
    img.push_back(mat.at<unsigned char>(i, j)); 

vl_dsift_process(dsift, &img[0]); 
Các vấn đề liên quan