gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:55 24 4
gpt4 key购买 nike

我在 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 在函数调用时只给出原始数组的副本,而不是数组本身。该函数可以修改数组,但 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 - 从 org.bytedeco.javacv.Frame 转换为 matlab 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32271101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com