Преобразование строки байтов в 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);