OpenCVからiplimageのセットを、iplimageを使用せず、代わりにc ++ /cliを介してbyte[]のリストを使用する別のプログラム(.net)に渡そうとしています。iplimageをbyte[]のリストに追加/変換する方法はありますか?
ありがとう。
他のことをする前に、時間をかけて、がどのように作成され、どのような情報が格納されているかIplImage
を学習してください。
次に、画像のピクセルにメンバーを介してアクセスできることに注意してくださいimageData
。これはunsigned char*
:です。
IplImage* image = cvLoadImage("starwars.jpg", 0);
int img_sz = image->width * image->height * image->nChannels;
unsigned char* data = (unsigned char*) malloc(img_sz);
memcopy(data, image->imageData, img_sz);
に変換するには、同様の手順を実行する必要がありますbyte[]
。ちなみに、この投稿] 2は、(とりわけ)をに変換する方法を示しIplImage*
ていSDL_Surface*
ます。
iplimage.imageData から正確なピクセルをコピーする場合は、Marshal.CopyIntPtr
を使用して(imageData) からマネージド配列 (byte[]) に
データをコピーできます。
しかし、imageData は圧縮されていないため、使用するimencode
かcvEncodeImage
、中間バッファーに圧縮してから、byte[]
上記のコードでそれを にコピーすることをお勧めします。
まず、可能であれば OpenCV の C++ API に切り替えることをお勧めします。これは、古い C インターフェイスと比較して、より多くの柔軟性と機能を提供します。
C++ インターフェイスでは、上記のタスクを実行するためのスニペットは次のようになります。
cv::Mat image = cv::imread(imname);
uchar *ptr = (uchar*)image.data
ptr (8 ビットの符号なしバイト データ) はどこでも使用できます。このデータを変更すると、実際の画像が変更されることに注意してください。これが発生したくない場合は、memcpy を使用してデータのコピーを取得します。