Преобразование строки байтов в cv:: mat

Мне нужно реализовать функцию, которая получает строку, содержащую байты изображения (получено через соединение с разъемом boost) и преобразование информация в OpenCV cv:: Mat.

Я тоже знаю ширину и высоту изображения и его размер в байтах. Моя функция выглядит так:

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);
}

какой лучший метод для этого? Имеет ли OpenCV конструктор для Mat из строки?

4 ответов


OpenCV Мат имеет конструктор от vector<byte>, но это не так интуитивно. Сначала вам нужно преобразовать из строки в вектор следующим образом:

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

затем вы можете создать cv:: Mat из вектора:

cv::Mat data_mat(vectordata,true);

вам также необходимо декодировать изображение (проверьте документацию, для каких типов разрешено, png, jpg, в зависимости от версии OpenCV)

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

теперь вы можете проверить, является ли результирующий размер изображения таким же, как у вас отправлено:

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

Если данные в строке являются необработанными пикселями (а не Jpeg/png и т. д.), Вы можете создать cv::mat напрямую

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

вот мое улучшенное решение Jav_Rock, проблема в том, что не ясно использовать vector (тип байта не определен в C++, я этого не нашел), вместо этого используйте vector, вот пример кода

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 будет видеть null как String end

читать изображения

cv::Mat image;
    image = cv::imread("../test/image.png", CV_LOAD_IMAGE_COLOR);

преобразовать в байты (это просто рабочий код, не проверенный на наличие утечек)

int dataSize = image.total() * image.elemSize();
//convert to bytes
std::vector<char> vec(dataSize);
memcpy(&vec[0], reinterpret_cast<char *>(image.data), dataSize);
std::string test2(vec.begin(), vec.end());

проверьте и посмотрите, работает ли преобразование

//test
cv::Mat data_mat(height,width,CV_8UC3,const_cast<char*>(test2.c_str()));
imwrite("out2.png", data_mat);