2017-10-10 18 views
0

私はpangolin::Image形式のrgbdイメージを取り込むアプリケーションを持っています。私はcv::Matでお送りしたいと思います。 cv :: Matをpangolin :: Imageに変換するにはどうすればいいですか?cv :: Matをpangolin :: Imageに変換しますか?

(センザンコウ:https://github.com/stevenlovegrove/Pangolin

画像ヘッダ:

https://github.com/stevenlovegrove/Pangolin/blob/master/include/pangolin/image/image.h

現在フォーマットである:firstRawは、アプリケーションを介して送信され

pangolin::ManagedImage<unsigned short> firstData(640, 480); 

    pangolin::Image<unsigned short> firstRaw(firstData.w, firstData.h, firstData.pitch, (unsigned short*)firstData.ptr); 

私が今持っている場合:

cv::Mat frame = cv::imread(filepath,0);

frameからfirstRawへの変換は何ですか?

私はこのように起動します。

int loadDepthFromMat(cv::Mat filepath, pangolin::Image<unsigned short> & depth) 
{ 
    int width = filepath.cols; 
    int height = filepath.rows; 

    pangolin::ManagedImage<unsigned short> depthRaw(width, height); 

    pangolin::Image<unsigned short> depthRaw16((unsigned short*)depthRaw.ptr, depthRaw.w, depthRaw.h, depthRaw.w * sizeof(unsigned short)); 


//copy data 

} 

ありがとうございました。

+2

pangolin :: Imageがホスト/ cpuメモリ上にあると仮定すると、pangolin Imageが割り当てられたことを確認した後、データポインタに対してmemcpy()を使用するだけです。最初にOpenCVイメージをunsigned short形式に変換してください。 –

+0

ご返信ありがとうございます。あなたは瞬間があれば私に例を挙げてください。 – anti

答えて

2

したがって、cv :: Matを正しいピッチ(またはOpenCVのチャンネル)で符号なしの短い形式に変換したと仮定すると、memcpyを使用するだけです。

(私はあなたの履歴書の名前を変更しました::ファイルパスからマットにマット(なぜそれがファイルパスと呼ばれている)?):

再び
memcpy((void*)depthRaw16.begin(), (void*)mat.data, mat.total() * mat.elemSize()); 

、あなたのセンザンコウの画像は、同一の寸法を有し、かつことを確認してください cv :: Matはunsigned shortに変換されます。

+0

ありがとう!したがって、 'Image'を次のように設定する限り、' int width = mat.cols; \t int height = mat.rows; \t pangolin :: ManagedImage depthRaw(width、height); '、私はうまくいくはずですか?今度はUShort変換を見つける必要があります...ありがとうございました – anti

+0

.. 'int channels = mat.channels();'と 'pangolin :: Image を追加するfirstRaw(width、height、channels、(unsigned short *)firstData.ptr); – anti

+2

cv :: Mat :: convertToが必要です。新しいcv :: Mat(たとえばmat_ushort)をインスタンス化し、mat.convertTo(mat_ushort、CV_16UC1);を実行します。 (グレースケールの場合)またはmat.convertTo(mat_ushort、CV_16UC3)。 (RGBの場合)またはCV_16UC4(RGBAの場合)。次に、新しいcv :: Matをmemcpy操作に使用します。 convertToを使用するとchannels()プロパティが設定されます。手動で設定すると何も行いません。 –

関連する問題