home *** CD-ROM | disk | FTP | other *** search
/ vis-ftp.cs.umass.edu / vis-ftp.cs.umass.edu.tar / vis-ftp.cs.umass.edu / pub / Software / ASCENDER / ascendMar8.tar / UMass / BuildingFinder / Lisp / cvv.lisp < prev    next >
Lisp/Scheme  |  1996-03-07  |  8KB  |  201 lines

  1. (in-package 'cme)
  2.  
  3. (defvar *bf-sensitivity* 0.5 "Building detection sensitivity setting")
  4. (defvar *bf-constrain-p* t "Apply building detection with constraints")
  5.  
  6. (defvar *bf-full-blocksize* 400.0 "Window size for full image detection.")
  7. (defvar *bf-full-overlap* 150.0 "Window overlap size for full image detection.")
  8. (defvar *bf-full-sensitivity* 0.5 "Building detection sensitivity setting")
  9. (defvar *bf-full-constrain-p* t "Apply building detection with constraints")
  10. (defvar *bf-param-adjust* nil "Manually adjust parameters")
  11. (defvar *bf-2.5d-lines* nil "Use 2.5d line grouping")
  12. (defvar *topdown-edgels-for-bdetect* nil "Cache edgels for one-time computation")
  13. (defvar *bf-angle-error* 0.15 "Grouping angle threshold")
  14. (defvar *bf-token-window* 6 "Column width for token line support")
  15. (defvar *bf-token-support* 0.7 "Percentage coverage for line support")
  16. (defvar *bf-line-support* 0.7 "Percentage coverage for top-down support")
  17. (defvar *bf-sweep-column* 5 "Width of column for top-down support")
  18. (defvar *bf-line-window* 6.0 "Size of window for line grouping")
  19. (defvar *bf-best-k* nil)
  20. (defvar *bf-k-cycles* 10)
  21.  
  22. (defun pick-bounding-box-and-pane  ()
  23.   (multiple-value-bind (pane x1 y1)
  24.      (ic::pick-a-pane-and-x-y "Pick lower left corner")
  25.   (multiple-value-bind (pane x2 y2)
  26.      (ic::pick-a-pane-and-x-y "Pick upper right corner")
  27.   (values (list x1 y1 x2 y2) pane))))
  28.  
  29. (defun popup-building-finder-menu ()
  30.   (ic::with-cvv-items
  31.      (((constrain "Apply shape refinement"
  32.      :yes-or-no
  33.      :value *bf-constrain-p*
  34.      :documentation
  35.        "Use Least Squares Constraints to modify final polygon shape")
  36.        (sensitivity "Sensitivity:"
  37.      :double-float-slider
  38.      :value *bf-sensitivity*
  39.      :format "%3g"
  40.          :min 0.0
  41.      :max 1.0
  42.      :documentation "Adjust sensitivity of the building detector")
  43.      (manual "Manually adjust parameters"
  44.          :yes-or-no :value *bf-param-adjust*
  45.          :documentation
  46.             "Ignore the sensitivity slider, set each parameter individually")
  47.     (topcycles "Output Best K cycles"
  48.      :yes-or-no :value *bf-best-k*
  49.      :documentation "Ignore hypothesis conflicts, output k best cycles")
  50.     (k-cycles "K:"
  51.      :integer :value *bf-k-cycles*
  52.      :documentation "Number of best cycles to display")
  53.     (2.5dlines "Use 2.5d line data"
  54.      :yes-or-no :value *bf-2.5d-lines*
  55.      :documentation
  56.         "Match image lines to compute height before building detection"))
  57.        :label "Building Detect"
  58.        :documentation "Detect building rooftops within an image region")
  59.      (if manual
  60.         (popup-building-parameters-menu))
  61.      (setf *bf-sensitivity* sensitivity)
  62.      (setf *bf-constrain-p* constrain)
  63.      (setf *bf-2.5d-lines* 2.5dlines *bf-param-adjust* manual)
  64.      (setf *bf-best-k* topcycles)
  65.      (if (null topcycles)
  66.     (setf k-cycles 0))
  67.      (setf *bf-k-cycles* k-cycles)
  68.      (multiple-value-bind (bbox panechoice) (pick-bounding-box-and-pane)
  69.        (let* ((topview (cme::top-view panechoice))
  70. ;;;          (image (view-image topview))
  71.           (image (ic::top-of-image-hierarchy (view-image topview)))
  72.           (2d-world (2d-world image))
  73.           (3d-world (3d-world 2d-world)))
  74.      (unless (ic::get-prop 3d-world :umass-site-model)
  75.        (error "No UMass site model has been initialized for this 3D world"))
  76.      (if 2.5dlines
  77.        (progn
  78.          (popup-epipolar-menu)
  79.          (compute-2.5dlines-for-building-detect panechoice bbox))
  80.        (write-2dlines-for-building-detect panechoice bbox))
  81.      (let* ((pane-trans (cme::inverse-transform
  82.                (cme::2d-to-window-transform topview))) 
  83.         (world-bbox (multiple-value-list
  84.            (apply #'cme::transform-2d-bounding-box pane-trans bbox))))
  85.        (setf *topdown-edgels-for-bdetect*
  86.          (apply #'compute-2dworld-canny-edges image world-bbox)))
  87.      (find-polygons sensitivity constrain manual  2.5dlines
  88.             (car bbox) (cadr bbox) (third bbox) (fourth bbox)
  89.             k-cycles (lci::create-c-handle panechoice))
  90.      (free-edgeimg *topdown-edgels-for-bdetect*)
  91.      t))))
  92.  
  93.  
  94. (defun popup-acquire-buildings-menu ()
  95. (ic::with-cvv-items
  96.      ((
  97.        (blocksize "Blocksize (in pixels)"
  98.     :double-float
  99.     :value *bf-full-blocksize*)
  100.        (overlap "Size of window overlap (in pixels)"
  101.     :double-float 
  102.     :value *bf-full-overlap*)
  103.        (constrain "Apply shape refinement"
  104.      :yes-or-no
  105.      :documentation
  106.        "Use Least Squares Constraints to modify final polygon shape")
  107.        (sensitivity "Sensitivity:"
  108.      :double-float-slider
  109.      :value 0.5
  110.      :format "%3g"
  111.          :min 0.0
  112.      :max 1.0
  113.      :documentation "Adjust sensitivity of the building detector")
  114.     (manual "Manually adjust parameters"
  115.      :yes-or-no
  116.      :documentation
  117.         "Ignore the sensitivity slider, set each parameter individually"))
  118.        :label "Building Detect"
  119.        :documentation "Detect building rooftops within an image region")
  120.      (setf *bf-full-blocksize* blocksize)
  121.      (setf *bf-full-overlap* overlap)
  122.      (setf *bf-full-sensitivity* sensitivity)
  123.      (setf *bf-full-constrain-p* constrain)
  124.      (if manual
  125.     (popup-building-parameters-menu))
  126.      (acquire-model sensitivity constrain manual blocksize overlap)))
  127.  
  128.  
  129. (defun popup-building-parameters-menu ()
  130. (ic::with-cvv-items
  131.      ((
  132.        (angle-error "Angle Error"
  133.        :double-float
  134.      :value *bf-angle-error*)
  135.     (line-endpoint-window "Endpoint window radius"
  136.      :double-float
  137.      :value *bf-line-window*)
  138.     (search-angle "Grouping Angle Error"
  139.      :double-float
  140.      :value *bf-angle-error*)
  141.     (support-column "Image support column"
  142.      :double-float
  143.      :value *bf-sweep-column*)
  144.     (min-line-support "Minimum image support percentage"
  145.      :double-float
  146.      :value *bf-line-support*)
  147.     (token-support "Minumum line support percentage"
  148.      :double-float
  149.      :value *bf-token-support*)
  150.     (token-window "Width of line support region"
  151.      :double-float
  152.      :value *bf-token-window*))
  153.     :label "Parameter Adjust"
  154.     :documentation "Manually set building detection parameters")
  155.      (setf *bf-angle-error* angle-error)
  156.      (setf *bf-line-window* line-endpoint-window)
  157.      (setf *bf-angle-error* search-angle)
  158.      (setf *bf-sweep-column* support-column)
  159.      (setf *bf-line-support* min-line-support)
  160.      (setf *bf-token-support* token-support)
  161.      (setf *bf-token-window* token-window)
  162.      (set-building-parameters angle-error line-endpoint-window search-angle
  163.          support-column min-line-support token-support
  164.          token-window)))
  165.  
  166.  
  167. (defun compute-2.5dlines-for-building-detect (panechoice bbox)
  168.   (let ((filename  (concatenate 'string user::*temp-directory*
  169.              *2_5dlines-filename*))
  170.     (2pt5dlines (epi::compute-2.5d-lines-in-pane-bbox
  171.              panechoice bbox
  172.              :endpoint-slop *last-epi-slop*
  173.              :delta-theta *last-epi-dtheta*
  174.              :min-support *last-epi-support-percentage*)))
  175.     (with-open-file (file filename :direction :output)
  176.        (format file "3D: YES~%")
  177.        (format file "BUCKETSIZE: ~f~%" 
  178.       (hist::histogram-bucket-width epi::*accum-histogram*))
  179.        (format file "DATA:~%")
  180.        (dolist (line 2pt5dlines)
  181.       (apply #'format file "~,2f ~,2f ~,2f ~,2f ~,4f ~,4f~%" line)))
  182.     (put-pathname-property
  183.       (2d-world (top-view panechoice))
  184.   ;;; (c-filename filename)
  185.      filename
  186.       *2_5dlines-propname*)
  187.     filename))
  188.  
  189. (defun write-2dlines-for-building-detect (panechoice bbox)
  190.   (let ((filename  (concatenate 'string user::*temp-directory*
  191.              *2dlines-filename*)))
  192.     (with-open-file (file filename :direction :output)
  193.        (format file "3D: NO~%")
  194.        (format file "DATA:~%")
  195.        (write-ascii-2dlines-in-pane-bbox file panechoice bbox))
  196.     (put-pathname-property
  197.       (2d-world (top-view panechoice))
  198.       filename
  199.       *2dlines-propname*)
  200.     filename))
  201.