私の目標は、デフォルトのOpenGLフレームバッファの内容を読み取り、ピクセルデータをcv::Mat
に保存することです。OpenGLのデフォルトのフレームバッファからピクセルデータを読み込み:FBOとPBOのパフォーマンス
1)同期:どうやらこれを達成する異なる方法がありますFBOとglRealPixels
cv::Mat a = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3);
glReadPixels(0, 0, 1920, 1080, GL_BGR, GL_UNSIGNED_BYTE, a.data);
2を使用)非同期:すべての情報から、PBOとglReadPixels
cv::Mat b = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo_userImage);
glReadPixels(0, 0, 1920, 1080, GL_BGR, GL_UNSIGNED_BYTE, 0);
unsigned char* ptr = static_cast<unsigned char*>(glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY));
std::copy(ptr, ptr + 1920 * 1080 * 3 * sizeof(unsigned char), b.data);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
を使用します私はこのトピックで収集した、非同期バージョン2)ははるかに速くなければなりません。しかし、両方のバージョンの経過時間を比較すると、その差はしばしば最小であり、時にはバージョン1のイベントがPBOバリアントよりも優れていることがわかります。パフォーマンスをチェックするために
、私は(this回答に基づいて)次のコードを挿入した:
std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
....
std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << std::endl;
PBOを作成するときに、私はまたの利用ヒントで実験しました:私は見つけられませんでしたGL_DYNAMIC_COPY
とGL_STREAM_READ
の違いの多くはここにあります。
フレームバッファからのこのピクセル読み取り操作の速度をさらに向上させる方法を提案してうれしいです。
'glReadPixels()'呼び出しの直後に結果が到着するのをブロックしているので、2番目のバージョンは実際には非同期ではありません。 –
'std :: copy'の呼び出しを意味していますか?実際に私がこの行をコメントアウトすると、効果は最小限に抑えられますが、バージョン1は時には高速です。 – Schnigges
GPUバッファをCPUメモリにマップしないと、予想通りですが、それ以降は 'cv :: Mat'をベクターに格納したいので、かなり大きな違いがあります – Schnigges