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 >
Wrap
Lisp/Scheme
|
1996-03-07
|
8KB
|
201 lines
(in-package 'cme)
(defvar *bf-sensitivity* 0.5 "Building detection sensitivity setting")
(defvar *bf-constrain-p* t "Apply building detection with constraints")
(defvar *bf-full-blocksize* 400.0 "Window size for full image detection.")
(defvar *bf-full-overlap* 150.0 "Window overlap size for full image detection.")
(defvar *bf-full-sensitivity* 0.5 "Building detection sensitivity setting")
(defvar *bf-full-constrain-p* t "Apply building detection with constraints")
(defvar *bf-param-adjust* nil "Manually adjust parameters")
(defvar *bf-2.5d-lines* nil "Use 2.5d line grouping")
(defvar *topdown-edgels-for-bdetect* nil "Cache edgels for one-time computation")
(defvar *bf-angle-error* 0.15 "Grouping angle threshold")
(defvar *bf-token-window* 6 "Column width for token line support")
(defvar *bf-token-support* 0.7 "Percentage coverage for line support")
(defvar *bf-line-support* 0.7 "Percentage coverage for top-down support")
(defvar *bf-sweep-column* 5 "Width of column for top-down support")
(defvar *bf-line-window* 6.0 "Size of window for line grouping")
(defvar *bf-best-k* nil)
(defvar *bf-k-cycles* 10)
(defun pick-bounding-box-and-pane ()
(multiple-value-bind (pane x1 y1)
(ic::pick-a-pane-and-x-y "Pick lower left corner")
(multiple-value-bind (pane x2 y2)
(ic::pick-a-pane-and-x-y "Pick upper right corner")
(values (list x1 y1 x2 y2) pane))))
(defun popup-building-finder-menu ()
(ic::with-cvv-items
(((constrain "Apply shape refinement"
:yes-or-no
:value *bf-constrain-p*
:documentation
"Use Least Squares Constraints to modify final polygon shape")
(sensitivity "Sensitivity:"
:double-float-slider
:value *bf-sensitivity*
:format "%3g"
:min 0.0
:max 1.0
:documentation "Adjust sensitivity of the building detector")
(manual "Manually adjust parameters"
:yes-or-no :value *bf-param-adjust*
:documentation
"Ignore the sensitivity slider, set each parameter individually")
(topcycles "Output Best K cycles"
:yes-or-no :value *bf-best-k*
:documentation "Ignore hypothesis conflicts, output k best cycles")
(k-cycles "K:"
:integer :value *bf-k-cycles*
:documentation "Number of best cycles to display")
(2.5dlines "Use 2.5d line data"
:yes-or-no :value *bf-2.5d-lines*
:documentation
"Match image lines to compute height before building detection"))
:label "Building Detect"
:documentation "Detect building rooftops within an image region")
(if manual
(popup-building-parameters-menu))
(setf *bf-sensitivity* sensitivity)
(setf *bf-constrain-p* constrain)
(setf *bf-2.5d-lines* 2.5dlines *bf-param-adjust* manual)
(setf *bf-best-k* topcycles)
(if (null topcycles)
(setf k-cycles 0))
(setf *bf-k-cycles* k-cycles)
(multiple-value-bind (bbox panechoice) (pick-bounding-box-and-pane)
(let* ((topview (cme::top-view panechoice))
;;; (image (view-image topview))
(image (ic::top-of-image-hierarchy (view-image topview)))
(2d-world (2d-world image))
(3d-world (3d-world 2d-world)))
(unless (ic::get-prop 3d-world :umass-site-model)
(error "No UMass site model has been initialized for this 3D world"))
(if 2.5dlines
(progn
(popup-epipolar-menu)
(compute-2.5dlines-for-building-detect panechoice bbox))
(write-2dlines-for-building-detect panechoice bbox))
(let* ((pane-trans (cme::inverse-transform
(cme::2d-to-window-transform topview)))
(world-bbox (multiple-value-list
(apply #'cme::transform-2d-bounding-box pane-trans bbox))))
(setf *topdown-edgels-for-bdetect*
(apply #'compute-2dworld-canny-edges image world-bbox)))
(find-polygons sensitivity constrain manual 2.5dlines
(car bbox) (cadr bbox) (third bbox) (fourth bbox)
k-cycles (lci::create-c-handle panechoice))
(free-edgeimg *topdown-edgels-for-bdetect*)
t))))
(defun popup-acquire-buildings-menu ()
(ic::with-cvv-items
((
(blocksize "Blocksize (in pixels)"
:double-float
:value *bf-full-blocksize*)
(overlap "Size of window overlap (in pixels)"
:double-float
:value *bf-full-overlap*)
(constrain "Apply shape refinement"
:yes-or-no
:documentation
"Use Least Squares Constraints to modify final polygon shape")
(sensitivity "Sensitivity:"
:double-float-slider
:value 0.5
:format "%3g"
:min 0.0
:max 1.0
:documentation "Adjust sensitivity of the building detector")
(manual "Manually adjust parameters"
:yes-or-no
:documentation
"Ignore the sensitivity slider, set each parameter individually"))
:label "Building Detect"
:documentation "Detect building rooftops within an image region")
(setf *bf-full-blocksize* blocksize)
(setf *bf-full-overlap* overlap)
(setf *bf-full-sensitivity* sensitivity)
(setf *bf-full-constrain-p* constrain)
(if manual
(popup-building-parameters-menu))
(acquire-model sensitivity constrain manual blocksize overlap)))
(defun popup-building-parameters-menu ()
(ic::with-cvv-items
((
(angle-error "Angle Error"
:double-float
:value *bf-angle-error*)
(line-endpoint-window "Endpoint window radius"
:double-float
:value *bf-line-window*)
(search-angle "Grouping Angle Error"
:double-float
:value *bf-angle-error*)
(support-column "Image support column"
:double-float
:value *bf-sweep-column*)
(min-line-support "Minimum image support percentage"
:double-float
:value *bf-line-support*)
(token-support "Minumum line support percentage"
:double-float
:value *bf-token-support*)
(token-window "Width of line support region"
:double-float
:value *bf-token-window*))
:label "Parameter Adjust"
:documentation "Manually set building detection parameters")
(setf *bf-angle-error* angle-error)
(setf *bf-line-window* line-endpoint-window)
(setf *bf-angle-error* search-angle)
(setf *bf-sweep-column* support-column)
(setf *bf-line-support* min-line-support)
(setf *bf-token-support* token-support)
(setf *bf-token-window* token-window)
(set-building-parameters angle-error line-endpoint-window search-angle
support-column min-line-support token-support
token-window)))
(defun compute-2.5dlines-for-building-detect (panechoice bbox)
(let ((filename (concatenate 'string user::*temp-directory*
*2_5dlines-filename*))
(2pt5dlines (epi::compute-2.5d-lines-in-pane-bbox
panechoice bbox
:endpoint-slop *last-epi-slop*
:delta-theta *last-epi-dtheta*
:min-support *last-epi-support-percentage*)))
(with-open-file (file filename :direction :output)
(format file "3D: YES~%")
(format file "BUCKETSIZE: ~f~%"
(hist::histogram-bucket-width epi::*accum-histogram*))
(format file "DATA:~%")
(dolist (line 2pt5dlines)
(apply #'format file "~,2f ~,2f ~,2f ~,2f ~,4f ~,4f~%" line)))
(put-pathname-property
(2d-world (top-view panechoice))
;;; (c-filename filename)
filename
*2_5dlines-propname*)
filename))
(defun write-2dlines-for-building-detect (panechoice bbox)
(let ((filename (concatenate 'string user::*temp-directory*
*2dlines-filename*)))
(with-open-file (file filename :direction :output)
(format file "3D: NO~%")
(format file "DATA:~%")
(write-ascii-2dlines-in-pane-bbox file panechoice bbox))
(put-pathname-property
(2d-world (top-view panechoice))
filename
*2dlines-propname*)
filename))