【问题标题】:Convert from org.bytedeco.javacv.Frame to matlab image从 org.bytedeco.javacv.Frame 转换为 matlab 图像
【发布时间】:2015-11-23 02:50:23
【问题描述】:

我在 MATLAB R2015a 中使用此代码:

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

【问题讨论】:

    标签: java matlab opencv javacv


    【解决方案1】:

    更快的方式,仍然低效。
    我认为没有更有效的方法可以做到这一点,除非你编写自己的 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);
    

    【讨论】:

      猜你喜欢
      • 2018-01-08
      • 2010-12-27
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 2017-04-25
      相关资源
      最近更新 更多