シミュレーターから画像のストリームを の形式で取得しており、さらに処理するためgil::image_view
にそれらを変換する必要があります。今まで、この回答cv::Mat
からコードを多かれ少なかれコピーしましたが、実際には理解していません。
auto image_view = // data received from an API
using pixel = decltype(image_view)::value_type;
static_assert(sizeof(pixel) == 4, "RGBA");
pixel raw_data[image_view.width() * image_view.height()];
boost::gil::copy_pixels(image_view, boost::gil::interleaved_view(image_view.width(),
image_view.height(),
raw_data,
image_view.width() *
sizeof(pixel)));
auto mat = cv::Mat(image_view.height(), image_view.width(), CV_8UC4, raw_data);
アルファ チャネルが使用されていないことは確かなので、別の image_view を定義することもできます。
auto rgb_view = boost::gil::color_converted_view<boost::gil::rgb8_pixel_t>(image_view);
using pixel = decltype(rgb_view)::value_type;
static_assert(sizeof(pixel) == 3, "RGB");
...
boost::gil::copy_pixels(...)
この場合、インターリーブされた rgba8 を rgb8 に一定時間で変換する方法がないため、を使用してピクセルをコピーすることは理にかなっています。
アプリケーションの性質を考えると、画像が既にメモリのどこかにあると確信しています。したがって、技術的には、最初の要素へのポインターを使用して OpenCV イメージを作成できますが、余分なチャネルを使用する必要があります。