我使用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.Frame
到org.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);