Bonjour à tous,
Je débute en programmation MATLAB, j'ai donc quelques soucis techniques que je n'arrive pas à résoudre pour le moment. Votre aide est la bienvenue...
J'ai fait un programme permettant d'ajouter à une vidéo acquise en temps réel (webcam) du texte et des signes de type flèches, camembert, couleurs (transparentes ou opaques), rectangles, superposés à l'image. Le but est de filmer une main et de guider la personne dans les mouvements qu'elle doit faire (amener la main vers la droite, la gauche, etc...) grâce aux signes et aux couleurs.
Mon problème est que ma vidéo est beaucoup plus lente que ce qu'elle devrait être lorsque j'ajoute les signes/incrustations. Selon les signes que j'ajoute, soit la vidéo est saccadée, soit je n'ai pour ainsi dire pas de vidéo et seule la dernière frame qui s'affiche. Dans tous les cas, je n'ai pas de message d'erreur. Je ne comprends pas ce qui cloche...
Voici une version de mon code contenant texte, 1 flèche et un camembert coloré. Ici la vidéo s'affiche mais est beaucoup trop lente :
D'ailleurs je n'arrive pas à attribuer une couleur différente à chaque portion du camembert. Si vous avez une solution pour ça aussi...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 % MAIN (Pie chart : 1 color) clear all close all clc %Access the image acquisition device vid=videoinput('winvideo',1,'I420_640x480'); %Set the properties of the video object set(vid,'FramesPerTrigger',inf); set(vid,'ReturnedColorspace','rgb'); vid.FrameGrabInterval=5; %Start the video acquisition start(vid); %Set a loop that stops after 200 frames while(vid.FramesAcquired<=200) %Get the snapshot of the current frame data = getsnapshot(vid); %Display the image imshow(data) hold on arrow=annotation('arrow',[0.35 0.65],[0.8 0.8],'Color','g','HeadStyle','cback1','HeadLength',21,'HeadWidth',11,'LineWidth',10); a=text(10,20,'COMMANDE ACTIVE'); set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'white'); %Pie Chart circle = rsmak('circle',200,[320 350]); quarter1 = fnbrk(fn2fm(circle,'rp'),3); quarter2 = fnbrk(fn2fm(circle,'rp'),4); fnplt(quarter1,3,'Color','black'); fnplt(quarter2,3,'Color','black'); line([120 520],[350 350],'Color','black','LineWidth',3); line([320 (320+(200*cos(-pi/3)))],[350 (350+(200*sin(-pi/3)))],'Color','black','LineWidth',3); line([320 (320+(200*cos(-(2*pi)/3)))],[350 (350+(200*sin(-(2*pi)/3)))],'Color','black','LineWidth',3); %Pie Chart Color (1 color) rayon=200; r=rayon*ones(100,1); theta=(-pi)*(0:99)'/99; [x,y] = pol2cart(theta,r); x=x+320; y=y+350; p=patch('XData',x, 'YData',y,'CData',[1 1 1],'parent',gca,'FaceColor','g'); set(p,'FaceAlpha',0.35, 'EdgeColor', 'none'); hold off end %Stop the video aquisition. stop(vid); %Flush all the image data stored in the memory buffer. flushdata(vid);
Autre version avec des rectangles dont la couleur est transparente. Ici je n'ai que la dernière frame qui s'affiche :
Un grand merci pour votre aide...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 % % % MAIN3 Rectangles clear all close all clc %Access the image acquisition device vid=videoinput('winvideo',1,'I420_640x480'); %Set the properties of the video object set(vid,'FramesPerTrigger',inf); set(vid,'ReturnedColorspace','rgb'); vid.FrameGrabInterval=5; %Start the video acquisition start(vid); %Set a loop that stops while(vid.FramesAcquired<=200) %Get the snapshot of the current frame data = getsnapshot(vid); %Display the image imshow(data) hold on arrow=annotation('arrow',[0.35 0.65],[0.8 0.8],'Color','g','HeadStyle','cback1','HeadLength',21,'HeadWidth',11,'LineWidth',10); %rectangle('Position',[300,200,200,500],'EdgeColor','r','LineWidth',2); a=text(10,20,'COMMANDE ACTIVE'); set(a, 'FontName', 'Arial', 'FontWeight', 'bold', 'FontSize', 12, 'Color', 'white'); %Pie Chart circle = rsmak('circle',200,[320 350]); quarter1 = fnbrk(fn2fm(circle,'rp'),3); quarter2 = fnbrk(fn2fm(circle,'rp'),4); fnplt(quarter1,3,'Color','black'); fnplt(quarter2,3,'Color','black'); line([120 520],[350 350],'Color','black','LineWidth',3); line([320 (320+(200*cos(-pi/3)))],[350 (350+(200*sin(-pi/3)))],'Color','black','LineWidth',3); line([320 (320+(200*cos(-(2*pi)/3)))],[350 (350+(200*sin(-(2*pi)/3)))],'Color','black','LineWidth',3); % Red Rectangle (left) annotation('rectangle',[160/640 210/640 80/640 150/480],'FaceColor','r','EdgeColor','none','FaceAlpha',0.35); % Green Rectangle (right) annotation('rectangle',[400/640 210/640 80/640 150/480],'FaceColor','g','EdgeColor','none','FaceAlpha',0.35); hold off end %Stop the video aquisition. stop(vid); %Flush all the image data stored in the memory buffer. flushdata(vid);
Partager