8

画像のバイトを含む文字列(ブーストソケット接続を介して受信)を受信し、情報を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

4 に答える 4

16

OpenCV Matにはからのコンストラクターがvector<byte>ありますが、これはそれほど直感的ではありません。最初に、この方法で文字列からベクトルに変換する必要があります。

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

次に、ベクトルからcv::Matを作成できます。

cv::Mat data_mat(vectordata,true);

また、画像をデコードする必要があります(OpenCVのバージョンに応じて、許可されているタイプ、png、jpgのドキュメントを確認してください)

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

これで、結果の画像のサイズが送信したサイズと同じかどうかを確認できます。

cout<<"Height: " << image.rows <<" Width: "<<image.cols<<endl;
于 2012-12-04T14:56:59.650 に答える
2

画像にはnull文字が含まれている可能性があり、文字列を処理するc関数は文字列の終わりとしてnullを認識するため、ここで簡単にトリップできます

画像を読む

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);
于 2018-07-30T05:42:41.683 に答える
1

文字列内のデータが(Jpeg / pngなどではなく)生のピクセルである場合は、cv::matを直接作成できます。

// assuming an RGB image in bytes              
cv::Mat mat(height,width,CV_8UC3,string.data());   
于 2012-12-04T15:48:58.863 に答える
0

これがJav_Rockの私の改善された解決策です、問題はベクトルを使用することが明確ではないということです(バイトタイプはc ++で定義されていません、私はそれを見つけられませんでした)、その代わりにベクトルを使用してください、ここにサンプルコードがあります

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
...
}
于 2016-07-24T03:57:02.557 に答える