2016-04-07 11 views
0

私のmexファイルから画像を私のmatlabファイルに出力しようとしていますが、matlabで開くと画像が正しくありません。画像をmatlabに戻すMex

MEXファイルをwithing出力画像IがmwSizeの向きを切り替え、ならびにnew_img.at<int>(j, i)ijを交換しようとしている

正しいです。

Mat image = imread(mxArrayToString(prhs[0])); 
Mat new_img(H,W, image.type(), Scalar(0)); 
// some operations on new_img 
imshow("gmm image", image); //shows the original image 
imshow("gmm1 image", new_img); //shows the output image 
waitKey(200); //both images are the same size as desired 

mwSize nd = 2; 
mwSize dims[] = {W, H}; 

plhs[0] = mxCreateNumericArray(nd, dims, mxUINT8_CLASS, mxREAL); 
if(plhs == NULL) { 
    mexErrMsgTxt("Could not create mxArray.\n");  
}  
char* outMat = (char*) mxGetData(plhs[0]); 

for (int i= 0; i < H; i++) 
{ 
    for (int j = 0; j < W; j++) 
    {  
    outMat[i +j*image.rows] = new_img.at<int>(j, i);  
    } 
} 

これは、あなたがこのカラー画像であることに言及しているので、これはあなたが考慮すべき行列の3つのスライスを有することを意味するマットファイル

gmmMask = GmmMex2(imgName,rect); 
imshow(gmmMask); % not the same as the output image. somewhat resembles it, but not correct. 

+0

'new_img'は' cv :: Mat'オブジェクトですか?これはどこにも定義されていないので、実際のコードからは明らかではありません。 – rayryeng

+0

申し訳ありません、ありがとうございました。それは –

+0

グレースケール画像ではありません。その理由を説明するかもしれません。以前は複数のチャンネルを説明しようとしましたが、わかりませんでした。 編集:今のところグレースケール画像を出力するときれいです –

答えて

2

であります。あなたのコードは1つのスライスだけを考慮します。まず、イメージの正しいサイズを宣言する必要があります。 MATLABでは、最初の次元はの常に、行の数は2番目の次元は列の数です。今度は、これに加えてチャンネル数を追加する必要があります。私はこれがRGB画像だと仮定しているので、3つのチャンネルがあります。

したがって、あなたにdimsを変更:3にndを変更

mwSize nd = 3; 
mwSize dims[] = {H, W, nd}; 

これはあなたが3Dマトリックスを作成できるようになりますように重要です。あなたは2Dマトリックスしか持っていません。次に、cv::Matオブジェクトの正しい場所にあるイメージピクセルにアクセスしていることを確認します。 forループの入れ子になったペアのイメージピクセルにアクセスする方法は、行メジャーファッション(最初に列を反復し、次に行を繰り返す)とします。したがって、ijを交換する必要があります.iが行にアクセスし、jが列にアクセスするためです。 はカラー画像のチャンネルにアクセスする必要がありますので、別のforループを補正する必要があります。グレースケールの場合、MATLAB MEXマトリックスのカラムメジャーメモリー設定を適切に補正しています。これは、jが列にアクセスし、次の列にアクセスするためにをスキップしてにする必要があるために検証されます。ただし、カラー画像に対応するには、次のピクセルレイヤーに移動するには、image.rows*image.colsまでスキップする必要があります。

のでごforループは現在、次のようになります。

for (int k = 0; k < nd; k++) { 
    for (int i = 0; i < H; i++) { 
     for (int j = 0; j < W; j++) { 
      outMat[k*image.rows*image.cols + i + j*image.rows] = new_img.at<uchar>(i, j, k); 
     } 
    } 
} 

は、ピクセルのコンテナが最も可能性の高い8ビットの符号なし文字であることに注意してください、とあなたがucharないintにテンプレートを変更する必要があります。これは、あなたのプログラムがクラッシュする理由を説明するかもしれません。

+0

私はあなたの変更を追加し、今matlabクラッシュ= [ –

+0

私は 'nd = 3'を変更することを確認しました...本当ですか? – rayryeng

+1

カラー画像(おそらく 'CV_8UC3'型)の場合、' ... = new_img.at (i、j)[k]; '?少なくとも '.at (i、j、k);' – Miki

関連する問題