imagealign.tcl
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:10k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. # Open the main image alignment window
  2. proc imageAlignmentUI {} {
  3.     if [window_Activate .imagealign] return
  4.     
  5.     set iaw [toplevel .imagealign]
  6.     wm title $iaw "Image Alignment"
  7.     window_Register $iaw
  8.     # How can I keep variables available to callbacks except global?
  9.     global curImageAlignFile 
  10.     global shortIAF
  11.     global fivetuples
  12.     global xyztuples
  13.     globalset fivetuples ""
  14.     globalset xyztuples ""
  15.     global curPasteMesh 
  16.     global shortPM 
  17.     global cameraType
  18.     global displayscalevar
  19.     # Set default camera type
  20.     if {![info exists cameraType]} {
  21. set cameraType DKCST5_2V
  22.     }
  23.     
  24.     # Set default display scale
  25.     if {![info exists displayscalevar]} {
  26. set displayscalevar 100
  27.     }
  28.     # Clear the current point correspondances when we start the window
  29.     # Lucas change:
  30.     # Used to be:     exec echo "" > [glob ~/.tmp2dpoints]
  31.     # Removed the glob, because if the file didn't exist (e.g. a user's
  32.     # first time), the glob would not return a name, and the image
  33.     # align window would never come up.
  34.     exec echo "" > ~/.tmp2dpoints
  35.     exec echo "" > ~/.xyztuples
  36.     # Set the initial state to not corresponding
  37.     global imageactive
  38.     set imageactive 0
  39.    
  40.     #buttons section 1 establishing things
  41.     button $iaw.opendisplay -text "Start Correlation" -command opendisplay
  42.     button $iaw.establishname -text "Establish Image Name..." -command establishname
  43.     label $iaw.curfilelabel -relief sunken -textvariable shortIAF
  44.     label $iaw.curmeshlabel -relief sunken -textvariable shortPM
  45.     button $iaw.setpastemesh -text "Establish paste mesh..." -command setpastemesh
  46.     scale $iaw.displaysize -relief ridge -orient horizontal -resolution 5 -label "Image Display Scale %" -from 5 -to 100 -variable displayscalevar
  47.     # buttons section 2 running correlation
  48.     button $iaw.refresh -text "Refresh 5-tuples" -command load5tuples
  49.     button $iaw.doneclicking -text "End Correlation" -command doneclicking
  50.     button $iaw.savexyzuv -text "Create .xyzuv" -command savexyzuv
  51.     button $iaw.createtsai -text "Create .tsai" -command createtsai
  52.     button $iaw.dopastecolor -text "Paste Color (This Image)" -command dopastecolor
  53.     #buttons section 3 pasting and viewing color
  54.     button $iaw.dopasteallcolor -text "Paste Color (Merged Images)" -command dopasteallcolor
  55.     button $iaw.loadlocalcolor -text "Load colored mesh(This Image)" -command loadlocalcolor
  56.     button $iaw.loadallcolor -text "Load colored mesh(Merged Images)" -command loadallcolor
  57.     button $iaw.projectivecolor -text "View Color Projection" -command projectivecolor
  58.     # Viewpoint buttons
  59.     button $iaw.setview -text "Zoom to .tsai camera viewpoint" -command setview
  60.     button $iaw.undoview -text "Undo viewpoint change" -command undoview
  61.     button $iaw.gentexrgb -text "Generate this projected .rgb" -command gentexrgb
  62.     button $iaw.gentexrgbs -text "Generate all projected .rgbs" -command gentexrgbs
  63.     # Seperators (ugly ones)
  64.     label $iaw.sep1  -background "#000"
  65.     label $iaw.sep2  -background "#000"
  66.     label $iaw.sep3  -background "#000"
  67.     # Camera types -- just add more to the list below as needed...
  68.     set cams [frame $iaw.cameras]
  69.     label $cams.l -text "Cam Type:" -anchor w
  70.     tk_optionMenu $cams.sort cameraType 
  71. "DKCST5_2" 
  72. "DKCST5_2V" 
  73. "DKCST5_rawpixels" 
  74. "DKCST5_640x480" 
  75. "DKC5000"
  76.     packchildren $cams -side left -fill x -expand 1
  77.     # The five tuple region
  78.     message $iaw.points -width 60c -relief sunken -textvariable fivetuples
  79.     # Pack it all
  80.     pack   $iaw.establishname 
  81. $iaw.curfilelabel $iaw.setpastemesh $iaw.curmeshlabel
  82. $iaw.cameras $iaw.displaysize 
  83. $iaw.sep1 
  84. $iaw.opendisplay $iaw.refresh $iaw.doneclicking 
  85. $iaw.savexyzuv $iaw.createtsai  
  86. $iaw.sep2 
  87. $iaw.projectivecolor 
  88. $iaw.dopastecolor $iaw.loadlocalcolor 
  89. $iaw.dopasteallcolor $iaw.loadallcolor 
  90. $iaw.sep3 
  91. $iaw.setview $iaw.undoview $iaw.gentexrgb $iaw.gentexrgbs
  92. $iaw.points -fill x
  93. }
  94. proc gentexrgb {} {
  95.     global curImageAlignFile 
  96.     global env
  97.     set tsaifile [file rootname $curImageAlignFile].tsai
  98.     set infile [file rootname $tsaifile].rgb
  99.     set grayrgbfile [file rootname $tsaifile].gray.rgb
  100.     set projrgbfile [file rootname $tsaifile].proj.rgb
  101.     plv_resetxform
  102.     plv_positioncamera $tsaifile
  103.     globalset theColorMode gray
  104.     setShininess 0
  105.     plv_writeiris [globalset toglPane] $grayrgbfile
  106.     plv_load_projective_texture $infile
  107.     globalset theColorMode texture
  108.     plv_writeiris [globalset toglPane] $projrgbfile
  109. }
  110. proc gentexrgbs {} {
  111.     global curImageAlignFile 
  112.     global env
  113.     set tsaifiles [glob [file dirname $curImageAlignFile]/*.tsai]
  114.     for {set i 0} {$i < [llength $tsaifiles]} {incr i} {
  115. set tsaifile [lindex $tsaifiles $i]
  116. set infile [file rootname $tsaifile].rgb
  117. set grayrgbfile [file rootname $tsaifile].gray.rgb
  118. set projrgbfile [file rootname $tsaifile].proj.rgb
  119. plv_resetxform
  120. plv_positioncamera $tsaifile
  121. globalset theColorMode gray
  122. setShininess 0
  123. plv_writeiris [globalset toglPane] $grayrgbfile
  124. plv_load_projective_texture $infile
  125. globalset theColorMode texture
  126. # redraw 1
  127. plv_writeiris [globalset toglPane] $projrgbfile
  128.     }
  129. }
  130. proc undoview {} {
  131.     restorecam previousCameraView; redraw 1
  132. }
  133. proc setview {} {
  134.     global curImageAlignFile
  135.     set tsaifile [file rootname $curImageAlignFile].tsai
  136.     # We reset the transform before setting it to the new camera
  137.     # because accumulated trackball junk screws things up
  138.     savecam previousCameraView
  139.     plv_resetxform
  140.     plv_positioncamera $tsaifile ; redraw 1
  141.  
  142. }
  143. proc projectivecolor {} {
  144.     global curImageAlignFile
  145.     plv_load_projective_texture $curImageAlignFile
  146.     globalset theColorMode texture
  147. }
  148. proc doneclicking {} {
  149.     global imageactive;
  150.     set imageactive 0
  151.     catch {exec killall displayclick}
  152. }
  153. proc establishname {} {
  154.     global xyztuples
  155.     set types {
  156. {{Image Files}       {.rgb}}
  157. {{PNG Files}         {.png}}
  158.     }
  159.     set filename [tk_getOpenFile -defaultextension .rgb -filetypes $types]
  160.     if {$filename != ""} {
  161. globalset curImageAlignFile $filename
  162. globalset shortIAF [file tail $filename]
  163. set xyztuples ""
  164. exec echo " " > [glob ~/.tmp2dpoints]
  165. load5tuples
  166.     }
  167. }
  168. proc opendisplay {} {
  169.     global curImageAlignFile
  170.     global xyztuples
  171.     global imageactive
  172.     global displayscalevar
  173.     if {($curImageAlignFile != "") && ($imageactive != 1)} {
  174. exec displayclick -geometry $displayscalevar{%} $curImageAlignFile > [glob ~/.tmp2dpoints] &
  175. globalset xyztuples ""
  176. globalset imageactive 1
  177. idlerefresh
  178.     }
  179. }
  180. proc loadlocalcolor {} {
  181.     global curImageAlignFile 
  182.     set meshfile [file rootname $curImageAlignFile].cs.set
  183. #    set scanname [file rootname $curImageAlignFile].cs
  184.     set scanname [readfile $meshfile]
  185. #   puts "name:$scanname"
  186.     selectScan $scanname
  187.     showOnlyMesh $scanname
  188.     globalset theColorMode true
  189. }
  190. proc loadallcolor {} {
  191.     global curPasteMesh
  192.     set meshfile [file rootname $curPasteMesh].cs.set
  193.     set scanname [readfile $meshfile]
  194. #    puts "name:$scanname"
  195.     selectScan $scanname
  196.     showOnlyMesh $scanname
  197.     globalset theColorMode true
  198. }
  199. proc dopastecolor {} {
  200.     global curPasteMesh
  201.     global curImageAlignFile 
  202.     global env
  203.     set tsaifile [file rootname $curImageAlignFile].tsai
  204.     set meshfile [file rootname $curImageAlignFile].cs.ply
  205.     set meshcfile [file rootname $curImageAlignFile].c.ply
  206.     if {[file exists $curPasteMesh]  && [file exists $tsaifile]} {
  207. exec /bin/rm -f $meshfile $meshcfile
  208.      exec $env(SCANALYZE_DIR)/imagealign/tsai2cply $curPasteMesh $tsaifile &
  209. }
  210.     
  211. }
  212. proc dopasteallcolor {} {
  213.     global curPasteMesh
  214.     global curImageAlignFile 
  215.     global env
  216.     set tsaifile [glob [file dirname $curImageAlignFile]/*.tsai]
  217.     set meshfile [file rootname $curPasteMesh].cs.ply
  218.     set meshcfile [file rootname $curPasteMesh].c.ply
  219.     if {[file exists $curPasteMesh]} {
  220. exec /bin/rm -f $meshfile $meshcfile
  221.      exec $env(SCANALYZE_DIR)/imagealign/tsai2mergecply $curPasteMesh $tsaifile &
  222. }
  223.     
  224. }
  225. proc setpastemesh {} {
  226.     set types {
  227. {{Ply Files}       {.ply}}
  228.     }
  229.     set filename [tk_getOpenFile -defaultextension .ply -filetypes $types]
  230.     if {$filename != ""} {
  231. globalset curPasteMesh $filename
  232. globalset shortPM [file tail $filename]
  233.     }
  234. }
  235.   
  236. proc savexyzuv {} {
  237.     global curImageAlignFile
  238.     global fivetuples
  239.     set newfile [file rootname $curImageAlignFile].xyzuv
  240.     if [file exists $newfile] {
  241. exec date >> $newfile.bak
  242. exec cat $newfile >> $newfile.bak
  243.     }
  244.     if [file exists $curImageAlignFile] {
  245. exec echo $fivetuples > $newfile
  246. puts "$newfile saved"
  247.     }
  248. }
  249. proc createtsai {} {
  250.     global curImageAlignFile
  251.     global env
  252.     global cameraType
  253.     set xyzuvfile [file rootname $curImageAlignFile].xyzuv
  254.     set tsaifile [file rootname $curImageAlignFile].tsai
  255.     set rootname [file rootname $curImageAlignFile]
  256.     if [file exists $tsaifile] {
  257. exec date >> $tsaifile.bak
  258. exec cat $tsaifile >> $tsaifile.bak
  259.     }
  260.     if [file exists $curImageAlignFile] {
  261. # exec echo "path ('/mich4/uvdavid/matlab',path); feval('find_extrinsics','$rootname') ; disp('$tsaifile created.')" | matlab  &
  262. exec $env(SCANALYZE_DIR)/imagealign/xyzuv2tsai -o -c $cameraType $xyzuvfile &
  263. puts "Creating $tsaifile ..."
  264.     }
  265. }
  266. proc idlerefresh {} {
  267.     global imageactive
  268.     load5tuples
  269.     if {$imageactive == 1} {
  270. after 1000 idlerefresh
  271.     }
  272. }
  273. proc load5tuples {} {
  274. global fivetuples
  275. global xyztuples
  276. #make a 5tuple file
  277.     exec echo $xyztuples > ~/.xyztuples
  278.     exec paste [glob ~/.xyztuples] [glob ~/.tmp2dpoints] > ~/.fivetuples
  279. #load 5tuple file
  280.     set f [open ~/.fivetuples]
  281.     set fivetuples [read $f 10000]
  282.     close $f
  283.     
  284. }
  285. proc addxyzpoint {xyz} {
  286.     global imageactive
  287.     global xyztuples
  288. # Check to make sure the imagealignment window is open
  289. # check to make sure we are taking correspondances now
  290. # check finally that we got a numeric result and not "hit background"
  291.     if [winfo exists .imagealign] {
  292. if {$imageactive == 1 && [scan $xyz "%f %f %f" foo1 foo2 foo3]}  {
  293.     set xyztuples "$xyztuples $xyz n"
  294.     load5tuples
  295. }
  296.     }
  297. }