2011-08-03 38 views
8

trong chương trình của tôi Tôi có chức năng lấy hình ảnh từ máy ảnh và phải đóng gói tất cả dữ liệu trong cấu trúc OpenCV Mat. Từ máy ảnh, tôi lấy chiều rộng, chiều cao và unsigned char* cho bộ đệm hình ảnh. Câu hỏi của tôi là làm thế nào tôi có thể tạo Mat từ dữ liệu này, nếu tôi có biến toàn cục Mat. Loại cho cấu trúc Mat tôi lấy CV_8UC1.opencv tạo mat từ dữ liệu máy ảnh

Mat image_; 

function takePhoto() { 
    unsigned int width = getWidthOfPhoto(); 
    unsinged int height = getHeightOfPhoto(); 
    unsinged char* dataBuffer = getBufferOfPhoto(); 
    Mat image(Size(width, height), CV_8UC1, dataBuffer, Mat::AUTO_STEP); 

    printf("width: %u\n", image.size().width); 
    printf("height: %u\n", image.size().height); 

    image_.create(Size(image.size().width, image.size().height), CV_8UC1); 
    image_ = image.clone(); 

    printf("width: %u\n", image_.size().width); 
    printf("height: %u\n", image_.size().height); 
} 

Khi tôi thử nghiệm chương trình của tôi, tôi có được quyền widthheight của image, nhưng widthheight của Mat toàn cầu của tôi image_0. Làm thế nào tôi có thể đặt dữ liệu trong toàn cầu của tôi Mat varible chính xác?

Cảm ơn bạn.

Trả lời

14

Thật không may, không phải clone() cũng không phải copyTo() sao chép thành công các giá trị của chiều rộng/chiều cao sang một Mat khác. Ít nhất là trên OpenCV 2.3! Đó là một sự xấu hổ, thực sự.

Tuy nhiên, bạn có thể giải quyết vấn đề này và đơn giản hóa mã của bạn bằng cách làm cho hàm trả về Mat. Bằng cách này, bạn sẽ không cần phải có biến toàn cục:

Mat takePhoto() 
{ 
    unsigned int width = getWidthOfPhoto(); 
    unsigned int height = getHeightOfPhoto(); 
    unsigned char* dataBuffer = getBufferOfPhoto(); 
    Mat image(Size(width, height), CV_8UC1, dataBuffer, Mat::AUTO_STEP); 
    return Mat; 
} 

int main() 
{ 
    Mat any_img = takePhoto(); 
    printf("width: %u\n", any_img.size().width); 
    printf("height: %u\n", any_img.size().height); 
} 
+0

Xin chào Karlphilip, Cảm ơn bạn rất nhiều vì đã đóng góp vào hoạt động ngăn xếp và trợ giúp chúng tôi. Im mới cho OpenCV và tìm câu trả lời của bạn khá hữu ích cho dự án tôi đang làm việc ngay bây giờ. Tôi có một câu hỏi nhanh, sự khác biệt giữa: cv :: Mat và cvMat và cvCreateMat() là gì? – user261002

+3

'cv :: Mat' là kiểu Mat cho giao diện C++ của OpenCV. 'cvMat' là dành cho giao diện C. 'cvCreateMat()' tạo một 'cvMat' trong giao diện C. Chúng ta không chiếm quyền điều khiển luồng này thêm nữa, nếu bạn có câu hỏi, bạn được tự do hỏi họ trong các chủ đề mới. Hẹn gặp lại. – karlphillip