【C++/Tensorflow/OpenCV/HALCON】画像オブジェクトの型変換

プログラミング

Tensorflow(Tensor型) → OpenCV(cv::Mat型) → HALCON(HObject型)への画像の型変換について。

TensorflowからHALCONへ画像オブジェクトを渡す場合、直接型変換ができなかったので、いったんOpenCVのcv::Mat型に変換し、さらにHALCONのHObjectに変換しました。
ところで、なぜHALCONに画像オブジェクトを渡す必要があるかというと、OpenCVに比べて、HALCONの方がラベリング処理やブロブ解析といった機能が充実しているからです。

Tensorflow側の処理

out_tensorsからoutput_vectorを生成しています。

OpenCV側の処理

memcpyを使うと一気に画像オブジェクトをコピーできます。
convertToで8bitのモノクロ画像に変換しています。

HALCON側の処理

GenImageConstで新規にho_Imageという画像オブジェクトをを生成します。
ここからは力技になりますが、forループでim_outの各画素値にアクセスして、SetGrayvalでho_Imageの各画素に値をコピペしていきます。
ループ処理が入っているため、画素数が大きい画像や複数の画像を処理する場合は、ポインタ渡しなどに比べると処理時間がかかかるかもしれませんので、注意してください。

ソースコード

//tensorflowのTensorからstd::vectorに変換
auto dst = out_tensors[0].flat<float>().data();
output_vector = input_vector;
std::copy_n(dst, output_vector.size(), output_vector.data());

//std::vectorからcv::Matに変換
memcpy(im_out.data, output_vector.data(), output_vector.size() * sizeof(float));
im_out.convertTo(im_out, CV_8U, 255);

//HALCON側の処理
HObject ho_Image;
HTuple hv_Pointer, hv_Type, hv_Width, hv_Height;
hv_Width = input_width;
hv_Height = input_height;
hv_Type = "byte";

//HALCONの画像オブジェクトの生成
GenImageConst(&ho_Image, hv_Type, hv_Width, hv_Height);

//ループ処理で画素値にアクセスする
for (int i = 0; i < input_width; i++) {
 for (int j = 0; j < input_height; j++)
  {
   HTuple val = im_out.at<unsigned char>(j, i);
   SetGrayval(ho_Image, j, i, val);
  }
}

HALCONのGetImagePointer1(ho_Image1, &hv_Pointer1, &hv_Type, &hv_Width, &hv_Height);でポインタ渡しができるかと思いチャレンジしたのですが、上手くいきませんでした。

コメント

タイトルとURLをコピーしました