2015-08-28 90 views
2

我使用MATLAB R2015a這個代碼:轉換爲MATLAB圖像

javaaddpath('javacv.jar'); 
import org.bytedeco.javacv.*; 
grabber = FrameGrabber.createDefault(0); 
grabber.start(); 
img = grabber.grab(); 

而且我得到了img變量是org.bytedeco.javacv.Frame類。
如何將此類轉換爲matlab圖像?

編輯

我已經完成了一半:
我從org.bytedeco.javacv.Frameorg.bytedeco.javacpp.opencv_core$Mat 在此代碼轉換:

javaaddpath('javacv.jar'); 
import org.bytedeco.javacv.*; 
import org.bytedeco.javacpp.*; 
import org.bytedeco.javacpp.opencv_highgui.*; 
grabber = FrameGrabber.createDefault(0); 
grabber.start(); 
img = grabber.grab(); 
buff = img.image(1); 
bytePointer = BytePointer(buff); 
cvImage = javaObject('org.bytedeco.javacpp.opencv_core$Mat',img.imageHeight,img.imageWidth,opencv_core.CV_8UC3); 
cvImage = cvImage.data(bytePointer); 
imshow('tal',cvImage); 

我可以看到正確地從imshow函數圖像。
仍然我想從org.bytedeco.javacpp.opencv_core$Ma轉換爲matlab圖像。
我該怎麼做?


能夠將其轉換成低效率的方式,
把代碼在這裏,希望有人將其轉換爲有效的方式代碼, 併發布在這裏作爲一個答案。

javaaddpath('javacv.jar'); 
import org.bytedeco.javacv.*; 
import org.bytedeco.javacpp.*; 
grabber = FrameGrabber.createDefault(0) 
grabber.start(); 
img = grabber.grab(); 
buff = img.image(1); 
w = img.imageWidth; 
h = img.imageHeight; 
%// from here is inefficient code 
charBuff = buff.asCharBuffer; 
n = charBuff.length; 
data = repmat(uint16(0),n,1); 
for i=0:n-1 
    data(i+1) = charBuff.get(i); 
end 
I = typecast(data, 'uint8'); 
I = cat(3,        ... 
     reshape(I(3:3:end),[w h])', ... 
     reshape(I(2:3:end),[w h])', ... 
     reshape(I(1:3:end),[w h])' ... 
    ); 
imshow(I); 

更快的方式,仍然效率低下。
我認爲沒有更有效的方法來做到這一點,除非你寫自己的java代碼,給你的字節數組,因爲matlab只給函數調用原始數組的副本,而不是它自己的數組。該函數可以修改數組,但matlab在完成時不會複製輸出。
閱讀 「前的最後一次」 的評論中Problem on defining Java int array in Matlab

javaaddpath('javacv.jar'); 
import org.bytedeco.javacv.*; 
import org.bytedeco.javacpp.*; 
grabber = FrameGrabber.createDefault(0) 
grabber.start(); 
img = grabber.grab(); 
buff = img.image(1); 
w = img.imageWidth; 
h = img.imageHeight; 
%// from here is inefficient code 
doubleBuff = buff.asDoubleBuffer; 
n = doubleBuff.remaining; 
data = zeros(n,1); 
for i=1:n 
    data(i) = doubleBuff.get(); 
end 
I = typecast(data, 'uint8'); 
I = cat(3,       ... 
     reshape(I(3:3:end),[w h])', ... 
     reshape(I(2:3:end),[w h])', ... 
     reshape(I(1:3:end),[w h])' ... 
    ); 
imshow(I); 

回答

0

比較快的方式,仍然效率低下。
我認爲沒有更有效的方法來做到這一點,除非你寫自己的java代碼,給你的字節數組,因爲matlab只給函數調用原始數組的副本,而不是它自己的數組。該函數可以修改數組,但matlab在完成時不會複製輸出。
閱讀Problem on defining Java int array in Matlab

javaaddpath('javacv.jar'); 
import org.bytedeco.javacv.*; 
import org.bytedeco.javacpp.*; 
grabber = FrameGrabber.createDefault(0) 
grabber.start(); 
img = grabber.grab(); 
buff = img.image(1); 
w = img.imageWidth; 
h = img.imageHeight; 
%// from here is inefficient code 
doubleBuff = buff.asDoubleBuffer; 
n = doubleBuff.remaining; 
data = zeros(n,1); 
for i=1:n 
    data(i) = doubleBuff.get(); 
end 
I = typecast(data, 'uint8'); 
I = cat(3,       ... 
     reshape(I(3:3:end),[w h])', ... 
     reshape(I(2:3:end),[w h])', ... 
     reshape(I(1:3:end),[w h])' ... 
    ); 
imshow(I); 
「最後才」 的評論