2016-04-07 39 views
0

Bir mex dosyasından matlab dosyama geri bir görüntü çıktı çalışıyorum, ancak matlab içinde açtığımda doğru değil. I new_img.at<int>(j, i) içinde i ve j takas gibi mwSize yönünü değiştirme çalıştılargörüntüyü matlab'a geri döndürme Mex

mex dosya Withing çıkış görüntü doğrudur;

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);  
    } 
} 

bu mat dosyasında olduğunu

gmmMask = GmmMex2(imgName,rect); 
imshow(gmmMask); % not the same as the output image. somewhat resembles it, but not correct. 
Bunun bir renkli görüntü olmanın ima Çünkü

+0

'new_img' a 'cv :: Mat' nesnesini mi? Bu, herhangi bir yerde tanımlanmadığı için gerçek koddan net değildir. – rayryeng

+0

Üzgünüz, evet, yanlış düzeltme bu –

+0

olduğunu düzeltmek bir gri tonlama görüntü değil, nedenini açıklayabilir. Birden fazla kanalı hesaba katmak için daha önce denedim ama anlayamadım. düzenleme: aynı zamanda gri tonlamalı görüntü çıktılarsa ben de im –

cevap

2

, bu dikkate almak matris üç dilim var demektir . Kodunuz sadece bir dilim düşünür. İlk olarak, resmin doğru boyutunu bildirdiğinizden emin olmanız gerekir. MATLAB'da, ilk boyut her zaman satır sayısı iken, ikinci boyut sütun sayısıdır. Şimdi bunun üstüne de kanal sayısını eklemelisiniz. Bunun bir RGB görüntü olduğunu varsayıyorum, bu yüzden üç kanal var.

nedenle, değiştirmek senin dims için: Bu bir 3D matris oluşturmak sağlayacak şekilde 3'e nd önemlidir değiştirme

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

. Sadece bir 2D matrisiniz var. Ardından, görüntü piksellerine cv::Mat nesnesinde doğru konumda eriştiğinizden emin olun. İç içe for döngülerindeki görüntü piksellerine erişme şekliniz, satır ana modayı (önce sütunların üzerinde yineleme, sonra satırlar) varsayar. Bu nedenle, i ve j kodlarını i satırlara erişir ve j sütunlara erişir. da renk görüntüsünün kanalına erişmeniz gerekecek, böylece telafi etmek için başka bir for döngüsüne ihtiyacınız olacak. Gri tonlama durumunda, MATLAB MEX matrisi için sütun büyük bellek konfigürasyonunu doğru bir şekilde telafi ettiniz. Bu doğrulanır, çünkü j sütunlara erişir ve üzerinden bir sonraki sütuna erişmek için satır miktarına geçmeniz gerekir. Bununla birlikte, renkli bir görüntüyü barındırmak için, bir sonraki piksel katmanına gitmek için de image.rows*image.cols ile atlamanız gerekir.

nedenle sizin for döngü şimdi olmalıdır: piksel konteyner büyük ihtimalle 8 bitlik işaretsiz bir karakter olduğunu

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); 
     } 
    } 
} 

not alın ve bu yüzden uchardeğilint şablonu değiştirmeniz gerekir. Bu ayrıca programınızın neden çökmekte olduğunu açıklayabilir.

+0

i değişikliklerinizi ekledim ve şimdi matlab çökmeleri = [ –

+0

'nd = 3'ü değiştirdiğime emin oldum ... emin misiniz? – rayryeng

+1

Renkli bir görüntüse (muhtemelen CV_8UC3 türünde), aşağıdaki gibi olmamalı: '... = new_img.at (i, j) [k];'? en azından '.at (i, j, k);' – Miki