OpenCV を使用した例を次に示します。
#include <cv.h>
#include <highgui.h>
int
main(int argc, char **argv)
{
cv::VideoCapture capture(argv[1]);
if (capture.grab())
{
cv::Mat_<char> frame;
capture.retrieve(frame);
//
// Convert to your byte array here
//
}
return 0;
}
テストはされていませんが、既存の動作中のコードから共食いしたため、動作するまでにそれほど時間はかかりません。
はcv::Mat_<unsigned char>基本的にバイト配列です。明示的に type の何かが本当に必要な場合unsigned char *は、適切なサイズのスペースを malloc し、次を使用して行列を反復処理できます。
ピクセル位置 ( ) または反復子 (およびその仲間)cv::Matを使用して、a をバイト配列に変換できます。cv::Mat_::at()cv::Mat_::begin()
ライブラリが画像データを単純なポインターとして公開することがめったにないのには、次のような多くの理由があります。
- これは、イメージ全体がメモリ内の連続したスペースを占有する必要があることを意味します。大きな画像を扱う場合、これは大きな問題です
- データの特定の順序をコミットする必要があり (ピクセル対非平面 - RGB プレーンは散在して保存されているか、個別に保存されていますか?)、柔軟性が低下します。
- ポインターの逆参照は、バグ (バッファー オーバーランなど) の原因となります。
したがって、ポインターが必要な場合は、少し作業を行う必要があります。