#1 Le 20/04/2011, à 12:21
- tiebo35
xrandr pour correction trapèze videoprojecteur
Bonjour à tous,
J'essaie d'utiliser la commande XRANDR avec l'option "TRANSFORM" afin de déformer mon affichage sous Ubuntu 10.10 pour lui donner une forme de trapèze.
Le but est de réaliser une correction de trapèze pour un vidéo-projecteur fait maison (qui ne dispose d'aucun réglage de trapèze), qui ne projette pas dans l'axe de lécran, mais plus bas.
Les 9 paramètres de l'option "TRANSFORM" définissent une matrice, mais je ne sais pas quelles valeurs leur donner...
Sinon j'ai une autre piste, xrandr / keystone.5c qui pourrait être utile à mon application, mais je ne sais pas non plus comment l'utiliser....
Est-ce que quelqu'un a déjà fait ce genre de chose ou a une idé sur la question?
Merci d'avance!
Hors ligne
#2 Le 20/04/2011, à 14:06
- gl38
Re : xrandr pour correction trapèze videoprojecteur
Voici un mode d'emploi sous la forme d'un diaporama
Cordialement,
Guy
Hors ligne
#3 Le 20/04/2011, à 22:25
- tiebo35
Re : xrandr pour correction trapèze videoprojecteur
Merci, j'avais déjà trouvé ce document, mais je ne le trouve pas très explicite, je ne suis pas un expert...
As-tu déjà eu l'occasion d'utiliser ce genre de fonctions?
Hors ligne
#4 Le 21/04/2011, à 14:35
- gl38
Re : xrandr pour correction trapèze videoprojecteur
Le programme keystone semble avoir un rapport avec xkeystone qui est installé sur ma machine. xkeystone a besoin de nikle et cairo-5c pour tourner (?). Il consent à ouvrir une fenêtre après avoir donné une très longue liste de fonctions.
Je n'arrive à rien avec cette fenêtre.
Le texte du programme keystone.5c explique le calcul à faire, dommage qu'il n'y ait pas la moindre doc !
Il faut faire de la géométrie projective : les parallèles ne le sont plus sur ton écran, et il faut envoyer le point d'intersection des côtés verticaux de ton image à l'infini pour obtenir une image non déformée. On utilise des vecteurs à 3 coordonnées pour représenter les points, mais deux vecteurs proportionnels représentent le même point d'où les coefficients q_1w, q_2w... du diaporama (page 18). Le calcul de la matrice est fait dans la fonction solve du programme.
On a un système à 13 inconnues qu'on ramène à 12 en posant m22=1 (m33 dans le diaporama), et on a 12 équations, et il n'y a qu'à résoudre !
Il y a des programmes tout prêts à l'emploi : par exemple ici.
Je reviens voir demain. S'il n'y a pas de solution, j'essaierai de faire un programme qui calcule la matrice à partir des coordonnées des points.
Cordialement,
Guy
Hors ligne
#5 Le 22/04/2011, à 23:45
- tiebo35
Re : xrandr pour correction trapèze videoprojecteur
Je vois vaguement ce que tu veux dire mais ça n'a pas l'air trivial...
L'idéal serait de pouvoir avoir une interface graphique sur laquelle on déplace simplement les 4 coins de l'image comme on peut le faire avec MediaPlayerClassic et ffdshow sous Windows lors de la lecture d'un film.
Dans mon cas, le videoprojecteur sera toujours positionné de la même façon, donc si on peut trouver une solution avec les matrices et xrandr-transform, ça serait le top puisque tout l'affichage serait corrigé et pas que la lecture des films!
Je suppose que la matrice dépend aussi de la résolution du vidéoprojecteur?
Hors ligne
#6 Le 24/04/2011, à 15:05
- gl38
Re : xrandr pour correction trapèze videoprojecteur
C'est galère !
Ce programme xkeystone semble d'après son listing faire le boulot, mais il ne fonctionne pas, du moins chez moi.
Le texte de keystone.5c est identique à xkeystone qui est donc écrit en clair (!?).
On peut donc copier chez soi le fichier /usr/bin/xkeystone, le rendre exécutable et le modifier à loisir.
Pour commencer il veut un output : il suffit de taper xrandr pour avoir le nom de celui que l'on veut modifier. On lançant
./xkeystone VGA1 2>log
le flot des fonctions ne s'affiche pas, une fenêtre où je ne peux rien faire s'affiche.
La ligne 154
{ x = 0, y = 0 } ...
du programme est étonnante. Il semble que c'est là que les coordonnées des sommets du quadrilatère s'initialisent, les ... me laissent rêveur ! J'ai mis à la place
{ x = 0, y = 0 }, { x = 1, y = 0 }, { x = 1, y = 1 }, { x = 0, y = 1 }
alors un calcul de matrice se produit, donnant
matrice =
0.0025, 0, 0
0, 0.00381679389313, 0
0, 0, 1
pour des points qui ont ces coordonnées
q0x = 0, q0y = 0
q1x = 3.2, q1y = 0
q2x = 3.2, q2y = 3.90839694656488
q3x = 0, q3y = 3.90839694656488
l'écran étant 1280x1024, ce n'est pas idiot ! car
3.2/0.0025=1280 et 3.90839694656488/0.00381679389313=1024
J'ai aussi essayé de faire le calcul donné dans le diaporama, on arrive en fait à un système linéaire de 6 équations à 6 inconnues. Mais là je croyais ma machine équipée pour faire le calcul, manque de pot, le maxima installé sous mon Ubuntu 9.10 veut bien faire 1+1 et trouve 2, mais se plante si on lui demande quelque chose de plus compliqué, d'après google, je ne suis pas le seul.
Sous Ubuntu 10.04, maxima a l'air de marcher, mais c'est moi qui fatigue !
Une consolation : ici
la commande
xrandr --fb 1024x768 --output VGA --transform 1.24,0.16,-124,0,1.24,0,0,0.000316,1
déforme mon écran rectangulaire en un trapèze !
A suivre.
Cordialement,
Guy
Dernière modification par gl38 (Le 24/04/2011, à 15:06)
Hors ligne
#7 Le 01/05/2011, à 15:14
- gl38
Re : xrandr pour correction trapèze videoprojecteur
Une solution peut être d'installer maxima.
Une fois que c'est fait on copie le texte ci-dessous dans un fichier, mettons keystone2.
w:1024;
h:768;
x:30;
m22:1;
q0x:0;q0y:0;
q1x:640;q1y:0;
q2x:640-x;q2y:400;
q3x:x;q3y:400;
m: matrix ([m00,m01,m02],[m10,m11,m12],[m20,m21,1]);
m02:q0x;
m12:q0y;
a : ((q2x - q3x)*(q1y - q2y) - (q2y - q3y)*(q1x - q2x)) * h;
b : (q2x - q1x - q3x + q0x) * (q1y - q2y) - (q2y - q1y - q3y + q0y) * (q1x - q2x);
m21 : - b / a;
m20 : (m21 * (q2x - q3x) * h + q2x - q1x - q3x + q0x) / ((q1x - q2x) * w);
m00 : m20 * q1x + (q1x - q0x) / w;
m10 : m20 * q1y + (q1y - q0y) / w;
m01 : m21 * q3x + (q3x - q0x) / h;
m11 : m21 * q3y + (q3y - q0y) / h;
''m;
print(m00, m01, m02, m10, m11, m12, m20, m21, m22);
n:invert(m);
float(''n);
Il faut donner dans les 2 premières lignes les valeurs w et h qui correspondent à la largeur et la hauteur l'écran que l'on veut déformer et qui sont données par xrandr.
Ensuite, j'ai supposé que le vidéoprojecteur était face au centre de l'écran, et on donne les coordonnées des points q0, q1, q2, q3 .
q0 est en haut à gauche, q1 en haut à droite, q2 en bas à droite et q3 en bas à gauche.
je suppose que q0 et q1 sont où on veut et qu'il faut déplacer q2 et q3 d'une valeur x.
J'ai choisi 640 et 400 dans un écran 1024x768 pour être sûr de voir ce qui se passe.
Si on tape dans un terminal
maxima -b keystone2
on doit obtenir une matrice numérique, que l'on donne à l'option transform de xrandr,
soit avec les valeurs données dans le fichier :
xrandr --fb 1024x768 --output VGA1 --transform 1.6,-0.12,0,0,1.74,0,0,-0.000234375,1
Pour d'autres valeurs, il suffit de modifier w, h, et les coordonnées des points q0, q1, q2, q3.
Cordialement,
Guy
Hors ligne
#8 Le 01/05/2011, à 22:12
- gl38
Re : xrandr pour correction trapèze videoprojecteur
Plus pratique, au lieu de maxima on peut installer octave
et utiliser le fichier keystone.inp
w=1024
h=768
x=30
m22=1
q0x=0
q0y=0
q1x=640
q1y=0
q2x=640-x
q2y=400
q3x=x
q3y=400
m02=q0x
m12=q0y
a = ((q2x - q3x)*(q1y - q2y) - (q2y - q3y)*(q1x - q2x)) * h
b = (q2x - q1x - q3x + q0x) * (q1y - q2y) - (q2y - q1y - q3y + q0y) * (q1x - q2x)
m21 = - b / a
m20 = (m21 * (q2x - q3x) * h + q2x - q1x - q3x + q0x) / ((q1x - q2x) * w)
m00 = m20 * q1x + (q1x - q0x) / w
m10 = m20 * q1y + (q1y - q0y) / w
m01 = m21 * q3x + (q3x - q0x) / h
m11 = m21 * q3y + (q3y - q0y) / h
m=[m00 m01 m02
m10 m11 m12
m20 m21 m22]
n=inv(m)
printf('%f,%f,%f,%f,%f,%f,%f,%f,%f\n',n(1,1),n(1,2),n(1,3),n(2,1),n(2,2),n(2,3),n(3,1),n(3,2),n(3,3))
On tape alors
octave keystone.inp
c'est presque le même fichier qu'avec maxima, mais on obtient directement grâce à printf l'argument à donner à --transform.
Cordialement,
Guy
Hors ligne
#9 Le 04/05/2011, à 23:10
- tiebo35
Re : xrandr pour correction trapèze videoprojecteur
Merci pour ce flot d'explications!
En utilisant Octave avec le fichier keystone.inp que tu proposes, j'ai l'erreur suivante:
error: `octave' undefined near line 11 column 1
Il manque des déclarations de variables ou quelque chose du style?
D'autre part, lorsque j'utilise la commande "xrand", j'obtiens le message d'erreur:
- avec mon écran de PC (19"):
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 320 x 240, current 1280 x 1024, maximum 1280 x 1024
default connected 1280x1024+0+0 0mm x 0mm
1280x1024 50.0* 51.0
1280x960 52.0
1152x864 53.0 54.0 55.0 56.0
1024x768 57.0 58.0 59.0
960x600 60.0
960x540 61.0
840x525 62.0 63.0 64.0 65.0
832x624 66.0
800x600 67.0 68.0 69.0 70.0
720x450 71.0
700x525 72.0 73.0
680x384 74.0 75.0
640x480 76.0 77.0 78.0 79.0 80.0
512x384 81.0 82.0
400x300 83.0
320x240 84.0 85.0
- avec mon vidéoprojecteur (15"):
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 320 x 240, current 1024 x 768, maximum 1024 x 768
default connected 1024x768+0+0 0mm x 0mm
1024x768 50.0* 51.0 52.0 53.0
832x624 54.0
800x600 55.0 56.0 57.0 58.0 59.0
720x450 60.0
680x384 61.0 62.0
640x480 63.0 64.0 65.0 66.0 67.0 68.0
512x384 69.0 70.0
400x300 71.0
320x240 72.0 73.0
Lorsque je lance la commande: "xrandr --fb 1024x768 --output default --transform 1.6,-0.12,0,0,1.74,0,0,-0.000234375,1", j'obtiens:
- avec mon écran de PC (19"):
xrandr: Failed to get size of gamma for output default
xrandr: specified screen 1024x768 not large enough for output default (2676x2328+-161+0)
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 154 (RANDR)
Minor opcode of failed request: 26 (RRSetCrtcTransform)
Value in failed request: 0x162
Serial number of failed request: 22
Current serial number in output stream: 23
- avec mon vidéoprojecteur (15"):
xrandr: Failed to get size of gamma for output default
xrandr: specified screen 1024x768 not large enough for output default (1988x1622+-112+0)
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 154 (RANDR)
Minor opcode of failed request: 26 (RRSetCrtcTransform)
Value in failed request: 0x162
Serial number of failed request: 20
Current serial number in output stream: 21
Faut-il faire une manip préalable sur l'affichage avec d'autres commandes?
Je ne comprends pas trop ce que signifie "xrandr: Failed to get size of gamma for output default"...
Merci d'avance pour tes explications, on touche presque au but!
Hors ligne
#10 Le 05/05/2011, à 21:33
- gl38
Re : xrandr pour correction trapèze videoprojecteur
Pour octave, j'ai retesté, ça me donne ceci :
GNU Octave, version 3.0.5
Copyright (C) 2008 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'.
Octave was configured for "i486-pc-linux-gnu".
Additional information about Octave is available at [url]http://www.octave.org[/url].
Please contribute if you find this software useful.
For more information, visit [url]http://www.octave.org/help-wanted.html[/url]
Report bugs to <bug@octave.org> (but first, please read
[url]http://www.octave.org/bugs.html[/url] to learn how to write a helpful report).
For information about changes from previous versions, type `news'.
w = 1024
h = 768
x = 30
m22 = 1
q0x = 0
q0y = 0
q1x = 640
q1y = 0
q2x = 610
q2y = 400
q3x = 30
q3y = 400
m02 = 0
m12 = 0
a = -178176000
b = 24000
m21 = 1.3470e-04
m20 = 0
m00 = 0.62500
m10 = 0
m01 = 0.043103
m11 = 0.57471
m =
0.62500 0.04310 0.00000
0.00000 0.57471 0.00000
0.00000 0.00013 1.00000
n =
1.60000 -0.12000 0.00000
0.00000 1.74000 0.00000
0.00000 -0.00023 1.00000
1.600000,-0.120000,0.000000,0.000000,1.740000,0.000000,0.000000,-0.000234,1.000000
En ce qui concerne xrandr j'obtiens des trucs du gene
Screen 0: minimum 320 x 200, current 1024 x 600, maximum 4096 x 4096
VGA1 disconnected (normal left inverted right x axis y axis)
LVDS1 connected 1024x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
1024x600 59.5*+
800x600 85.1 72.2 75.0 60.3 56.2
640x480 85.0 72.8 75.0 59.9
720x400 85.0
640x400 85.1
640x350 85.1
TV1 disconnected (normal left inverted right x axis y axis)
avec un vrai nom pour l'output (VGA,...)
Cordialement,
Guy
Hors ligne
#11 Le 05/05/2011, à 22:22
- tiebo35
Re : xrandr pour correction trapèze videoprojecteur
Pour Octave, ça marche aussi chez moi, je n'avais pas compris qu'en fait il faut taper "octave keystone.inp" dans un terminal et pas dans Octave...
Il ne me reste plus qu'à trouver d'où me vient l'erreur "xrandr: Failed to get size of gamma for output default" qui m'empêche apparemment d'utiliser xrandr et l'option "transform".
Est-ce que quelqu'un a une idée? Ca a peut-être quelque chose à voir avec les pilotes nvidia, la configuration du fichier xorg.conf ou un truc du style?
Merci d'avance.
Hors ligne