2015-08-28 86 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); 
“最后才” 的评论