0

シミュレーターから画像のストリームを の形式で取得しており、さらに処理するため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 イメージを作成できますが、余分なチャネルを使用する必要があります。

4

1 に答える 1

1

image_view当時、所有権がないにもかかわらず、 が基になる生データのメモリ位置を指すことができるとは思いもしませんでした。これらすべてのautos が翻訳されたものを調べても、混乱は解消されませんでした。質問を書くことで、それを解決するためのアイデアが得られました。

データが既にメモリ内にあると仮定すると、下流のライブラリで使用できる生データにアクセスするのは非常に簡単です。次のコード スニペットは、他のユーザーが問題に対処するのに役立ちます。

  1. 別の画像形式 (ここでは 24bpp) に変換してからcv::Mat: すべてのピクセルをコピーする必要があります
auto image_view = // data received from an API
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");
pixel raw_data[rgb_view.width() * rgb_view.height()];
boost::gil::copy_pixels(image_view, boost::gil::interleaved_view(rgb_view.width(),
                                                                 rgb_view.height(),
                                                                 raw_data,
                                                                 rgb_view.width() *
                                                                 sizeof(pixel)));
auto mat = cv::Mat(image_view.height(), image_view.width(), CV_8UC3, raw_data);
  1. に直接変換cv::Mat: コピー不要
auto image_view = // data received from an API
static_assert(sizeof(decltype(image_view)::value_type) == 4, "RGBA");
auto mat = cv::Mat(image_view.height(), image_view.width(), CV_8UC4, &image_view(0, 0));
于 2020-11-06T15:22:25.167 に答える