2015-08-28 4 views
2

J'utilise ce code dans Matlab R2015a:Convertir de org.bytedeco.javacv.Frame à l'image Matlab

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

Et je suis variable de img qui est org.bytedeco.javacv.Frame classe.
Comment convertir cette classe en image matlab?

EDIT

J'ai à mi-chemin:
-je convertir org.bytedeco.javacv.Frame à org.bytedeco.javacpp.opencv_core$Mat dans ce code:

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

je peux en mesure de voir correctement l'image de la fonction imshow.
Encore je veux convertir de org.bytedeco.javacpp.opencv_core$Ma à l'image de matlab.
Comment je peux le faire?


Capable de convertir de manière inefficace,
Mettre le code ici, nous espérons que quelqu'un va le convertir en code de manière efficace, et publierons ici comme une réponse.

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

Plus rapide, encore inefficace.
Je pense qu'il n'y a pas de façon plus efficace de le faire, sauf si vous écrivez votre propre code java, qui vous donne ce tableau d'octets, parce que matlab ne donne que duplication de primitive array sur appel de fonction, et non le tableau lui-même. la fonction peut modifier le tableau, mais matlab ne duplique pas la sortie quand c'est fait.
Lire le "avant-dernier" commentaire dans 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); 

Répondre

0

un moyen plus rapide, toujours inefficace.
Je pense qu'il n'y a pas de façon plus efficace de le faire, sauf si vous écrivez votre propre code java, qui vous donne ce tableau d'octets, parce que matlab ne donne que duplication de primitive array sur appel de fonction, et non le tableau lui-même. la fonction peut modifier le tableau, mais matlab ne duplique pas la sortie quand c'est fait.
Lire le commentaire "avant-dernier" dans 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);