我有这 3 个 defcfuns,用于包装在 C 中的 OpenCV 函数(C++)(包括 C 和 C++ 函数定义),前 2 个,%brisk
并且surf0
都可以用作(self feature-detector)
底部的参数,%feat-detect-detect
. 如果前两个的输出和self
参数feat-detect-detect
只是:指针,但是我需要将它们的所有三种类型都定义为与页面底部的类型类似,这样我才能使用终结器。这三个的所有终结器和类型都是相同的,只需在页面底部的四个函数中替换 inbrisk
和surf
for feature-detector
,您就会知道每个函数的样子。我应该只调用输出类型brisk
和surf
输入类型吗?feat-detect-detect
使用相同的名称,并使它们都在页面底部使用相同的 4 个函数类型/终结器组合,或者有更好的方法。
;; BRISK::BRISK(int thresh=30, int octaves=3, float patternScale=1.0f)
;; BRISK* cv_create_BRISK(int thresh, int octaves, float patternScale)
(defcfun ("cv_create_BRISK" %brisk) brisk
(thresh :int)
(octaves :int)
(pattern-scale :float))
;; SURF::SURF()
;; SURF* cv_create_SURF()
(defcfun ("cv_create_SURF" surf0) surf)
;; void FeatureDetector::detect(const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask=Mat() ) const
;; void cv_FeatureDetector_detect3(FeatureDetector* self, Mat* image, vector_KeyPoint* keypoints, Mat* mask)
(defcfun ("cv_FeatureDetector_detect3" %feat-detector-detect) :void
(self feature-detector)
(image mat)
(keypoints (:pointer vector-keypoint))
(mask mat))
(define-foreign-type feature-detector ()
((garbage-collect :reader garbage-collect :initform nil :initarg
:garbage-collect))
(:actual-type :pointer)
(:simple-parser feature-detector))
(defclass cv-feature-detector ()
((c-pointer :reader c-pointer :initarg :c-pointer)))
(defmethod translate-to-foreign ((lisp-value cv-feature-detector) (c-type feature-detector))
(c-pointer lisp-value))
(defmethod translate-from-foreign (c-pointer (c-type feature-detector))
(let ((feature-detector (make-instance 'cv-feature-detector :c-pointer c-pointer)))
(when (garbage-collect c-type)
(tg:finalize feature-detector (lambda () (del-feature-detector c-pointer))))
feature-detector))
ound matches of keypoints from two images."
(%draw-matches img1 keypoints1 img2 keypoints2 matches1to2 outimg match-color single-point-color matches-mask flags))