OpenGLの描画ウィンドウをOpenCVを使って画像保存・解析する方法

 研究でシミュレーションをするときに,OpenGLを使うことがある.OpenGLの描画ウィンドウを画像として保存したかったので,調べたところ,OpenCVを使う方法が見つかった.

使い方

 こちらのブログ記事に書かれているコードを元にした.

npal-shared.hatenablog.com

この記事では,OpenGLの関数 glReadBuffer と glReadPixels を使って,取得した情報をOpenCVの IplImage 構造体に格納している.ただ,IplImage は現在のOpenCV(私が今使っているのはVersion4.3.0)では使われなくなっており,cv::Mat を使うのが一般的となっているので,cv::Mat で同様のことを行えるようにコードを改変した.

 改変は以下の Stack Overflow でのやりとりを引用した.OpenGLでのバッファ取得から cv::Mat への情報取得までは,RGBAの4チャンネルに設定して,その後,自分の使いたいカラーモードに変換する方が,最初から自分の欲しいカラーモードを設定して操作するより,簡便な気がした.

stackoverflow.com

コード

 下に載せているコードでは,取得した cv::Mat data を表示するだけで,保存する関数まで記述していないけれど,cv::Mat の形式に落とし込めればあとはどうとでも操作できると思うので,割愛する.OpenGLとOpenCVでは座標系の向きがxyだけ見ると上下逆になるので,cv::flip で表示のために上下反転させている.

OpenGLにおけるRetina display対策

 MacでOpenGLを使うと,Retina displayのせいで描画内容の1/4しか表示されない.このため,Viewport や glReadpixels を使うときにウィンドウの幅,高さをそれぞれ2倍する必要がある(コードで"twice the size for Mac Retina display"とコメントが付いているところ).本当はWindowsとMacで統一した書き方をしたいのだけど,今のところ解決法が解らない.ご存じの方は教えていただけると助かります.