2012-12-04 38 views
5

tôi cần phải thực hiện một chức năng mà nhận một chuỗi chứa các byte của một hình ảnh (nhận qua kết nối tăng socket) và chuyển đổi các thông tin vào một cv OpenCV: : Mat.Chuyển đổi một chuỗi các byte để cv :: mat

Tôi cũng biết chiều rộng và chiều cao của hình ảnh và kích thước của hình ảnh tính theo byte. Chức năng của tôi trông giống như sau:

void createImageFromBytes(const std::string& name, std::pair<int,int> dimensions, const std::string& data) 
{ 
    int width,height; 
    width = dimensions.first; 
    height = dimensions.second; 
    //convert data to cv::Mat image 

    std::string filepng = DATA_PATH"/" + name +".png"; 
    imwrite(filepng, image); 
} 

Phương pháp nào tốt nhất để thực hiện việc này? OpenCV có một hàm tạo cho Mat từ một chuỗi không?

Trả lời

9

OpenCV Mat có một hàm tạo từ vector<byte>, nhưng điều này không trực quan. Bạn cần phải chuyển đổi từ chuỗi vector theo cách này đầu tiên:

std::vector<byte> vectordata(data.begin(),data.end()); 

Sau đó, bạn có thể tạo một cv :: Mat từ vector:

cv::Mat data_mat(vectordata,true); 

Bạn cũng cần phải giải mã hình ảnh (kiểm tra tài liệu cho mà loại được cho phép, png, jpg, tùy theo phiên bản OpenCV)

cv::Mat image(cv::imdecode(data_mat,1)); //put 0 if you want greyscale 

Bây giờ bạn có thể kiểm tra nếu kích thước kết quả của hình ảnh cũng giống như một trong những bạn gửi:

cout<<"Height: " << image.rows <<" Width: "<<image.cols<<endl; 
1

Nếu dữ liệu trong chuỗi là pixel thô (chứ không phải là một Jpeg/png vv), bạn có thể tạo ra cv :: mat trực tiếp

// assuming an RGB image in bytes    
cv::Mat mat(height,width,CV_8UC3,string.data()); 
+4

Không để chọn nit, nhưng không phải là chiều cao và hàng cùng một điều? – trianta2

+0

Tôi nhận được lỗi về biên dịch phàn nàn rằng không có hàm tạo nào phù hợp cho việc sử dụng cv :: Mat này. Có thể cập nhật cho opencv kể từ khi bài viết của bạn đã phá vỡ giải pháp của bạn? –

0

Đây là giải pháp cải thiện của tôi về Jav_Rock, vấn đề đó là không rõ ràng để sử dụng vector (loại byte không được xác định trong c + +, tôi đã không tìm thấy rằng), thay vì đó, sử dụng vector, đây là một mã ví dụ

int func(char * pfile){ 
string strfile = pfile; 
std::vector<unsigned char> vectordata(strfile.begin(),strfile.end()); 
Mat data_mat(vectordata, true); 
Mat graySacleFrame = imdecode(data_mat, 0); //PGM image 
... 
} 
Các vấn đề liên quan