从org.bytedeco.javacv.Frame转换为matlab图像

时间:2015-08-28 12:28:00

标签: java matlab opencv javacv

我在MATLAB R2015a中使用此代码:

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

我得到imgorg.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);

1 个答案:

答案 0 :(得分: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);