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 / View / view-analysis.lisp
Lisp/Scheme  |  1995-08-14  |  6KB  |  179 lines

  1. ;;; VIEW-ANALYSIS.LISP
  2. ;;;
  3. ;;; Support Routines for Viewpoint Selection/Verification for 
  4. ;;; three Dimensional Perceptual Organization.
  5. ;;;
  6. ;;;
  7. ;;; Author: Christopher O. Jaynes
  8. ;;; Date: June 10, 1995
  9. ;;;
  10. ;;
  11. ;------------------------------------------------------------
  12. ; (c) Copyright 1995 by The University of Massachusetts
  13. ;------------------------------------------------------------
  14.  
  15. (in-package 'grouping)
  16.  
  17.  
  18.  
  19.  
  20. ;;********************************************************
  21. ;; Generic Projection Routines.
  22. ;;
  23. ;;(defun project-point (projection x y z)
  24.   "Projects 3D world point x y z into image plane u v."
  25.  ;; (projmat-3d-to-2d (projection-projmat projection) x y z))
  26. ;;
  27. ;;(defun backproject-point (projection u v zval)
  28. ;;  "Backproject image point u v and return the 3d point where
  29. ;;  the backprojection ray intersects the plane z = zval."
  30. ;;  (when (null (projection-inverse-projmat projection))
  31. ;;     (setf (projection-inverse-projmat projection)
  32. ;;           (inverse-projmat (projection-projmat projection))))
  33. ;;  (let ((invproj (projection-inverse-projmat projection)))
  34. ;;    (multiple-value-bind (a b)
  35. ;;          (projmat-2d-to-3d nil u v invproj)
  36. ;;      (let ((k (/ (- zval (third b)) (third a))))
  37. ;;        (la:v+ b (la:vs k a))))))
  38.  
  39.  
  40. ;;*********************************************************
  41. ;; Given a line in a single image, create a 3d rectangle where
  42. ;; the length is the backprojected endpoint length and the
  43. ;; height is the grouping depth.
  44. ;;
  45. ;; First, a rectangle within the image is created with 
  46. ;; vertecies r1,r2,r3,r4;
  47. ;;
  48. ;; The 2d rectangle is backprojected to create a rectangle in
  49. ;; the world.
  50. (defun grouping-box (2dw pt1 pt2)
  51.    " Generates a 3d grouping region from the backprojected image 
  52.    points."
  53.    (let* ((proj (3d-to-2d-projection 2dw))
  54.       (avgHeight (/ (+ (third pt1) (third pt2)) 2.0))
  55.       (u1 (car pt1))
  56.       (v1 (cadr pt1))
  57.       (u2 (car pt2))
  58.       (v2 (cadr pt2)))
  59.      (multiple-value-bind (r1x r1y r2x r2y)
  60.     (fex::perpendicular-from-point-on-line
  61.          u1 v1 u2 v2 u1 v1 (- *group-column-image-width*))
  62.        (multiple-value-bind (r3x r3y r4x r4y)
  63.          (fex::perpendicular-from-point-on-line
  64.             u1 v1 u2 v2 u2 v2  (- *group-column-image-width*))
  65.       (setf vertexlist (list 
  66.           (multiple-value-list (inverse-project-point proj r1x r1y
  67.              (- avgHeight *grouping-column-depth*)))
  68.             (multiple-value-list (inverse-project-point proj r3x r3y
  69.              (-  avgHeight *grouping-column-depth*)))
  70.             (multiple-value-list (inverse-project-point proj r4x r4y
  71.              (- avgHeight  *grouping-column-depth*)))
  72.             (multiple-value-list (inverse-project-point proj r2x r2y
  73.              (- avgHeight  *grouping-column-depth*)))
  74.           (multiple-value-list (inverse-project-point proj r1x r1y 
  75.             (+ avgHeight *grouping-column-depth*)))
  76.          (multiple-value-list (inverse-project-point proj r3x r3y
  77.             (+  *grouping-column-depth* )))
  78.           (multiple-value-list (inverse-project-point proj r4x r4y 
  79.             (+ avgHeight *grouping-column-depth* )))
  80.            (multiple-value-list (inverse-project-point proj r2x r2y
  81.             (+ avgHeight *grouping-column-depth* ))))))))
  82.     (make-vertex-array-from-vertex-list vertexlist))
  83.    
  84.  
  85.  
  86. (defun make-grouping-box (2dw pt1 pt2)
  87.  (let* ((cube (make-cube-object :world (3d-world 2dw)))
  88.           (verts (grouping-box-vertices 2dw pt1 pt2)))
  89.      (setf (vertices cube) verts)
  90.      cube))
  91.  
  92.  
  93. ;;
  94. ;; Compute the image area covered by projecting the 3d group-box into 
  95. ;; the image plane using 'proj'
  96. ;;
  97.  
  98. ;;
  99. ;; 2.5d Box to image.
  100. ;;
  101. ;; 
  102. ;; In order to verify a possible 2.5d grouping, a particular image
  103. ;; region must be chosen from the set of possible viewpoints.
  104. ;; A quadralateral is formed in the world between the the two corner
  105. ;; features with a depth defined by the allowed error.  This region is
  106. ;; projected into each image and its area is computed.  The projection
  107. ;; that yields the maximum area is chosen as the "best" viewpoint 
  108. ;; for verification.
  109. ;;
  110. ;;
  111. ;;
  112. ;; best-verify-viewpoint
  113. ;;
  114. ;; Determine the best viewpoint for image verification of the proposed
  115. ;; grouping.  If the proposed grouping takes place in 2d then a 3d
  116. ;; 'grouping-object' should have been created using the 'grouping-box'
  117. ;; routine.  
  118. ;;
  119. ;; For each 2d-world, project the grouping-box and compute the area
  120. ;; subtracting out occlusions that can be detected from the model,
  121. ;; the "best" viewpoint is the one that has the maximum projected
  122. ;; visible image region between the two features that are being
  123. ;; grouped.
  124. ;;
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141. (defmethod image-bounding-box ((self cached-bounding-box-mixin) image)
  142.   "Returns multiple values (imin imax jmin jmax) giving the image coordinates
  143. of the bounding box of the 3d object"
  144.   (with-slots (object-to-world-transform) self
  145.               (multiple-value-bind (oxmin oxmax oymin oymax ozmin ozmax)
  146.         (compute-bounding-box self)
  147.       (when oxmin
  148.         (multiple-value-bind (wxmin wymin wzmin)
  149.             (transform-point object-to-world-transform oxmin oymin ozmin)
  150.           (multiple-value-bind (wxmax wymax wzmax)
  151.               (transform-point object-to-world-transform oxmax oymax ozmax)
  152.             (multiple-value-bind (i000 j000)
  153.                 (transform-world-to-image wxmin wymin wzmin image)
  154.               (multiple-value-bind (i001 j001)
  155.                   (transform-world-to-image wxmin wymin wzmax image)
  156.                 (multiple-value-bind (i010 j010)
  157.                     (transform-world-to-image wxmin wymax wzmin image)
  158.                   (multiple-value-bind (i011 j011)
  159.                       (transform-world-to-image wxmin wymax wzmax image)
  160.                     (multiple-value-bind (i100 j100)
  161.                         (transform-world-to-image wxmax wymin wzmin image)
  162.                       (multiple-value-bind (i101 j101)
  163.                           (transform-world-to-image wxmax wymin wzmax image)
  164.                         (multiple-value-bind (i110 j110)
  165.                             (transform-world-to-image wxmax wymax wzmin image)
  166.                           (multiple-value-bind (i111 j111)
  167.                               (transform-world-to-image wxmax wymax wzmax imag
  168. e)
  169.  
  170.                             (values (min i000 i001 i010 i011 i100 i101 i110 i1
  171. 11)
  172.                                     (max i000 i001 i010 i011 i100 i101 i110 i1
  173. 11)
  174.                                     (min j000 j001 j010 j011 j100 j101 j110 j1
  175. 11)
  176.                                     (max j000 j001 j010 j011 j100 j101 j110 j1
  177. 11))))))))))))))))
  178.  
  179.