- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
好的,我尝试了这种从外国翻译过来的方法,它确实有效我在我的库中的 structs.lisp 文件中定义了这些,它在我所有其他依赖项之前首先加载
(cffi:defcstruct (cv-size :class cv-size-type)
(width :int)
(height :int))
(defmethod cffi:translate-from-foreign (p (type cv-size-type))
(let ((plist (call-next-method)))
(make-size :width (getf plist 'width)
:height (getf plist 'height))))
我的 CvGetSize 和 cvCreateImage、get-size 和 create-image 的 opencv 包装器是这样定义的
;; CvSize cvGetSize(const CvArr* arr)
(cffi:defcfun ("cvGetSize" get-size) (:struct cv-size)
(arr cv-arr))
;; IplImage* cvCreateImage(CvSize size, int depth, int channels)
(cffi:defcfun ("cvCreateImage" %create-image) ipl-image
(size :int64)
(depth :int)
(channels :int))
(defun create-image (size depth channels)
"Create an image with dimensions given by SIZE, DEPTH bits per
channel, and CHANNELS number of channels."
(let ((nsize (size->int64 size)))
(%create-image nsize depth channels)))
这里是size->int64的定义
(DEFUN SIZE->INT64 (S) (+ (SIZE-WIDTH S) (ASH (SIZE-HEIGHT S) 32)))
it converts get-size output which is a structure here:
#S(SIZE :WIDTH 640 :HEIGHT 480)
into 64-bit integer, which CFFI can handle
但我喜欢 translate-foreign defmethod 的想法
所以我想知道您是否可以展示我如何通过方法制作下面的翻译成外国版本,这真的会让我的图书馆很棒
(defmethod cffi:translate-from-foreign (p (type cv-size-type))
(let ((plist (call-next-method)))
(make-size :width (getf plist 'width)
:height (getf plist 'height))))
我本来打算尝试一些东西并添加它,但是对于 get-size 输出结构,它不是一个 plist,所以不确定要放什么
(let ((plist (call-next-method)))
部分,对于
(make-size :width (getf plist 'width)
:height (getf plist 'height))))
部分,我希望找到除 size->64 函数之外的另一种方法,因为它是 2 年前在 cl-opencv https://github.com/ryepup/cl-opencv 时制作的。第一次出来我想制作一个比这更好的包装器...我已经使用 cl-opencv 添加了 100 个新函数 5000 行代码示例和文档以及一个新的 structs.lisp 文件所以如果有人可以帮助我我会很高兴所有最新的 cffi 工具,所以我可以做除 int64 之外的其他事情...加上如果我有一个函数来包装 int64 东西不起作用的地方我准备好
再次感谢 S.O. 上的所有回答者。你们真的对我的图书馆帮助很大。
编辑
好吧,我想我把一切都定义为你 Madeira 先生如下(我展示了 repl session )
CL-OPENCV>
;; (cffi:foreign-type-size '(:struct cv-size)) = 8
(cffi:defcstruct (cv-size :class cv-size-type)
(width :int)
(height :int))
(defmethod cffi:translate-from-foreign (p (type cv-size-type))
(let ((plist (call-next-method)))
(make-size :width (getf plist 'width)
:height (getf plist 'height))))
(defmethod cffi:translate-to-foreign (value (type cv-size-type))
(let ((plist ()))
(setf (getf plist 'width) (size-width value)
(getf plist 'height) (size-height value))
(call-next-method plist type)))
;; CvSize cvGetSize(const CvArr* arr)
(cffi:defcfun ("cvGetSize" get-size) (:struct cv-size)
(arr (:pointer cv-arr)))
;; IplImage* cvCreateImage(CvSize size, int depth, int channels)
(cffi:defcfun ("cvCreateImage" create-image) (:pointer (:struct ipl-image))
(size (:struct cv-size))
(depth :int)
(channels :int))
STYLE-WARNING: redefining CL-OPENCV:GET-SIZE in DEFUN
STYLE-WARNING: redefining CL-OPENCV:CREATE-IMAGE in DEFUN
CREATE-IMAGE
CL-OPENCV> (defparameter capture (create-camera-capture 0))
(defparameter frame (query-frame capture))
(defparameter img-size (get-size frame))
(defparameter img (create-image img-size +ipl-depth-8u+ 3))
但是我得到了错误
There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION
CFFI:TRANSLATE-INTO-FOREIGN-MEMORY (5)>
when called with arguments
(#S(SIZE :WIDTH 640 :HEIGHT 480) #<CV-SIZE-TYPE CV-SIZE>
#.(SB-SYS:INT-SAP #X7FFFE5427FF0)).
[Condition of type SIMPLE-ERROR]
因为我的外来翻译函数正在转换 cv-size 的输出进入结构
CL-OPENCV> img-size
#S(SIZE :WIDTH 640 :HEIGHT 480)
我很欣赏翻译成外部函数,但是使用旧的外部翻译函数它不起作用,因为 make-size 部分...你能帮我弄清楚 cvCreateImage 需要什么来满足它吗? ...这是链接 4:
http://docs.opencv.org/modules/core/doc/old_basic_structures.html?highlight=eimage#createimage
我可以让下面的版本正常运行(我显示 repl session )
5
CL-OPENCV> ; TODO SIZE-WIDTH AND HEIGHT
;; CvSize cvGetSize(const CvArr* arr)
(cffi:defcfun ("cvGetSize" get-size) (:pointer (:struct cv-size))
(arr cv-arr))
;; IplImage* cvCreateImage(CvSize size, int depth, int channels)
(cffi:defcfun ("cvCreateImage" create-image) (:pointer (:struct ipl-image))
(size (:pointer (:struct cv-size)))
(depth :int)
(channels :int))
STYLE-WARNING: redefining CL-OPENCV:GET-SIZE in DEFUN
STYLE-WARNING: redefining CL-OPENCV:CREATE-IMAGE in DEFUN
CREATE-IMAGE
CL-OPENCV> (defparameter capture (create-camera-capture 0))
(defparameter frame (query-frame capture))
(defparameter img-size (get-size frame))
(defparameter img (create-image img-size +ipl-depth-8u+ 3))
IMG
CL-OPENCV> (cffi:with-foreign-slots ((n-size id n-channels
alpha-channel depth color-model
channel-seq data-order origin
align width height roi
mask-roi image-id tile-info
image-size image-data width-step
border-mode border-const image-data-origin)
img(:struct ipl-image))
(format t "n-size = ~a~%id = ~a~%n-channels = ~a~%alpha-channel = ~a~%depth = ~a~%color-model = ~a~%channel-seq = ~a~%data-order = ~a~%origin = ~a~%align = ~a~%width = ~a~%height = ~a~%roi = ~a~%mask-roi = ~a~%image-id = ~a~%tile-info = ~a~%image-size = ~a~%image-data = ~a~%width-step = ~a~%border-mode = ~a~%border-const = ~a~%image-data-origin = ~a~%"
n-size id n-channels
alpha-channel depth color-model
channel-seq data-order origin
align width height roi
mask-rOI image-id tile-info
image-size image-data width-step
border-mode border-const image-data-origin))
n-size = 144
id = 0
n-channels = 3
alpha-channel = 0
depth = 8
color-model = 4343634
channel-seq = 5392194
data-order = 0
origin = 0
align = 4
width = 640
height = 480
roi = #.(SB-SYS:INT-SAP #X00000000)
mask-roi = #.(SB-SYS:INT-SAP #X00000000)
image-id = #.(SB-SYS:INT-SAP #X00000000)
tile-info = #.(SB-SYS:INT-SAP #X00000000)
image-size = 921600
image-data =
width-step = 1920
border-mode = #.(SB-SYS:INT-SAP #X00000000)
border-const = #.(SB-SYS:INT-SAP #X00000000)
image-data-origin = NIL
NIL
所以我从 ipl-image 的插槽中获取数据,但这似乎不是正确的方法因为 id 必须能够通过 get-size 取消对 cv-size 指针输出的引用
这里是关于 cvGetSize 函数 im 包装的文档
http://docs.opencv.org/modules/core/doc/old_basic_structures.html?highlight=eimage#getsize
如你所见,它是一个指针
CL-OPENCV> img-size
#.(SB-SYS:INT-SAP #X1E000000280)
所以当我这样做的时候:
(cffi:with-foreign-object (img-size '(:pointer (:struct cv-size)))
;; Initialize the slots
;; Return a list with the coordinates
(cffi:with-foreign-slots ((width height) img-size
(list width height)))
我明白了
There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION CFFI::SLOTS (1)>
when called with arguments
(#<CFFI::FOREIGN-POINTER-TYPE (:POINTER (:STRUCT CV-SIZE))>).
[Condition of type SIMPLE-ERROR]
当我这样做的时候
(cffi:with-foreign-object (img-size '(:struct cv-size))
;; Initialize the slots
;; Return a list with the coordinates
(cffi:with-foreign-slots ((width height) img-size (:struct cv-size))
(list width height)))
我明白了
(346539 0)
只是无意义的输出
我尝试 mem-refing 和 mem-arefing 指针并得到未处理的内存故障错误
如果你能帮我弄清楚怎么写compatible
从国外翻译
和
翻译成外国函数我会非常感激=)。
但是如果我在其中的任何位置使用 make-size 或 size-width,height create-image 必须在其中包含 size->int64 因为它们只因为该功能而起作用。
最佳答案
这里有一个更好而且非常简单的演示!
你只需要添加 :class xxx
到 cffi:defcstruct
然后 (cffi:defmethod translate-into-foreign-memory (object (type xxx) pointer) yyyy)
,它将自动按值将结构传递给外部函数!!惊人的!!
而(cffi:defmethod translate-from-foreign (pointer (type xxx)) zzzz)
会将返回的结构数据转换成lisp数据。
好的,这是代码:
(defcstruct (%CvSize :class cv-size)
(width :int)
(height :int))
(defmethod translate-into-foreign-memory (object (type cv-size) pointer)
(with-foreign-slots ((width height) pointer (:struct %CvSize))
;; After this declare this method, you could just pass a two member
;; list as a (:struct %CvSize)
(setf width (nth 0 object))
(setf height (nth 1 object))))
(defmethod translate-from-foreign (pointer (type cv-size))
(with-foreign-slots ((width height) pointer (:struct %CvSize))
;; You can change this and get return value in other format
;; for example: (values width height)
(list width height)))
(defcfun ("cvGetSize" %cvGetSize)
(:struct %CvSize) ;; Here must use (:struct xxx)
"C: CvSize cvGetSize(const CvArr* arr)"
(arr :pointer))
(defcfun ("cvCreateImage" %cvCreateImage)
%IplImage
"C: IplImage* cvCreateImage(CvSize size, int depth, int channels)"
(size (:struct %CvSize)) ;; Here must use (:struct xxx)
(depth %IPL_DEPTH)
(channels :int))
%cvGetSize
的测试代码:(defmacro with-pointer-to-pointer ((var pointer) &body body)
`(with-foreign-object (,var :pointer)
(setf (mem-ref ,var :pointer)
,pointer)
(progn ,@body)))
(defun release-image (image)
(with-pointer-to-pointer (pointer image)
(%cvReleaseImage pointer)))
(defmacro with-load-image ((var filename &optional (iscolor :%CV_LOAD_IMAGE_COLOR)) &body body)
"Wrap %cvLoadImage and make sure %cvReleaseImage."
(let ((result (gensym)))
`(let ((,var (%cvLoadImage ,filename ,iscolor))
,result)
(unwind-protect
(setf ,result
(multiple-value-list (progn ,@body)))
(release-image ,var))
(values-list ,result))))
(defun image-width-height (filename)
(with-load-image (image filename)
(%cvGetSize image)))
(image-width-height "/path/to/image.jpg")
;;=>
;; (962 601)
注意:返回值不再是指针或其他奇怪的东西,它返回一个列表(您可以更改 (cffi:defmethod translate-from-foreign () xxxx)
中的代码使其成为将返回值转换为其他类型。
%cvCreateImage
的测试代码:(%cvCreateImage (list 480 640))
注意:是的!只需传递一个列表,就会自动转换为 (:struct %CvSize) !那太好了,不是吗?!!!不再需要使用 make-instance
或其他奇怪的代码了^_^
注意:因为您必须首先像这样cffi:define-foreign-libray
和cffi:use-foreign-library
:
(cffi:define-foreign-library opencv-highgui
(:darwin (:or "libopencv_highgui.dylib"))
(:linux (:or "libhighgui.so"
"libopencv_highgui.so"))
(t (:default "libhighgui")))
(cffi:use-foreign-library opencv-highgui)
(cffi:define-foreign-type cv-size ()
((width :reader width :initarg :width)
(height :reader height :initarg :height))
(:actual-type :int64)
(:simple-parser %cv-size))
(defmethod translate-to-foreign (value (type cv-size))
(+ (width value)
(ash (height value) 32)))
(defmethod translate-from-foreign (value (type cv-size))
(values (- value
(ash (ash value -32) 32))
(ash value -32)))
(cffi:defcfun ("cvGetSize" %cvGetSize)
%cv-size
"C: CvSize cvGetSize(const CvArr* arr)"
(arr :pointer))
(cffi:defcfun ("cvCreateImage" %cvCreateImage)
%IplImage
"C: IplImage* cvCreateImage(CvSize size, int depth, int channels)"
(size %cv-size)
(depth %IPL_DEPTH)
(channels :int))
注意:(:actual-type :int64)
表示cv-size
的实际类型为:int64
(C int64)。
注意:(:simple-parser %cv-size)
表示您可以将 %cv-size
放置到 return-type 或 < strong>parameter-type like :pointer
:int
do in cffi:defcfun
。请查看声明 %cvGetSize
和 %cvCreateImage
。
%cvGetSize
的测试代码:
(defmacro with-pointer-to-pointer ((var pointer) &body body)
`(with-foreign-object (,var :pointer)
(setf (mem-ref ,var :pointer)
,pointer)
(progn ,@body)))
(defun release-image (image)
(with-pointer-to-pointer (pointer image)
(%cvReleaseImage pointer)))
(defmacro with-load-image ((var filename &optional (iscolor :%CV_LOAD_IMAGE_COLOR)) &body body)
"Wrap %cvLoadImage and make sure %cvReleaseImage."
(let ((result (gensym)))
`(let ((,var (%cvLoadImage ,filename ,iscolor))
,result)
(unwind-protect
(setf ,result
(multiple-value-list (progn ,@body)))
(release-image ,var))
(values-list ,result))))
(defun image-width-height (filename)
(with-load-image (image filename)
(%cvGetSize image)))
(image-width-height "/path/to/image.jpg")
;;=>
;; 962
;; 601
%cvCreateImage
的测试代码:
(%cvCreateImage (make-instance 'cv-size
:width 480
:height 640))
注意:因为您必须首先像这样cffi:define-foreign-libray
和cffi:use-foreign-library
:
(cffi:define-foreign-library opencv-highgui
(:darwin (:or "libopencv_highgui.dylib"))
(:linux (:or "libhighgui.so"
"libopencv_highgui.so"))
(t (:default "libhighgui")))
(cffi:use-foreign-library opencv-highgui)
关于c - 我如何编写可比较的 cffi :translate-into foreign defmethod for this cffi:translate-from-foreign?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19133763/
我只想从客户端向服务器发送数组 adc_array=[w, x, y, z]。下面是客户端代码,而我的服务器是在只接受 json 的 python 中。编译代码时我没有收到任何错误,但收到 2 条警告
我是 lua 和 Node js 的新手,我正在尝试将我正在开发的移动应用程序连接到服务器。问题是它连接到服务器,但我尝试传递的数据丢失或无法到达服务器。对我正在做的事情有什么问题有什么想法吗? th
我在这个页面上工作 http://www.haskell.org/haskellwiki/99_questions/Solutions/4 我理解每个函数的含义,看到一个函数可以像这样以多种方式定义,
我目前正在尝试将数据写入 excel 以生成报告。我可以将数据写入 csv 文件,但它不会按照我想要的顺序出现在 excel 中。我需要数据在每列的最佳和最差适应性下打印,而不是全部打印在平均值下。这
所以,我正在做一个项目,现在我有一个问题,所以我想得到你的帮助:) 首先,我已经知道如何编写和读取 .txt 文件,但我想要的不仅仅是 x.hasNext()。 我想知道如何像 .ini 那样编写、读
我正在尝试编写一个函数,该函数将返回作为输入给出的任何数字的阶乘。现在,我的代码绝对是一团糟。请帮忙。 function factorialize(num) { for (var i=num, i
这个问题已经有答案了: Check variable equality against a list of values (16 个回答) 已关闭 4 年前。 有没有一种简洁或更好的方法来编写这个条件
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在尝试创建一个 for 循环,它将重现以下功能代码块,但以一种更具吸引力的方式。这是与 Soundcould 小部件 API 实现一起使用的 here on stackoverflow $(doc
我有一个非常令人困惑的问题。我正在尝试更改属性文件中的属性,但它只是没有更改... 这是代码: package config; import java.io.FileNotFoundException
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在开发一个用户模式(Ring3)代码级调试器。它还应支持.NET可执行文件的本机(x86)调试。基本上,我需要执行以下操作: 1).NET在隐身模式下加载某些模块,而没有LOAD_DLL_DEBU
我有一个列表,我知道有些项目是不必要打印的,我正在尝试通过 if 语句来做到这一点...但是它变得非常复杂,所以有没有什么方法可以在 if 语句中包含多个索引而无需打印重写整个声明。 看起来像这样的东
我很好奇以不同方式编写 if 语句是否会影响程序的速度和效率。所以,例如写一个这样的: bool isActive = true; bool isResponding = false; if (isA
我在搜索网站的源代码时找到了一种以另一种方式(我认为)编写 if 语句的方法。 代替: if(a)b; 或: a?b:''; 我读了: !a||b; 第三种方式和前两种方式一样吗?如果是,为什么我们要
我的数据采用以下格式(HashMap的列表) {TeamName=India, Name=Sachin, Score=170} {TeamName=India, Name=Sehwag, Score=
我目前正在完成 More JOIN operations sqlzoo 的教程,遇到了下面的代码作为#12 的答案: SELECT yr,COUNT(title) FROM movie JOIN ca
我正试图找到一种更好的方法来编写这段代码: def down_up(array, player) 7.downto(3).each do |row| 8.times do |col
出于某种原因,我的缓冲区中充满了乱码,我不确定为什么。我什至用十六进制编辑器检查了我的文件,以验证我的字符是否以 2 字节的 unicode 格式保存。我不确定出了什么问题。 [打开文件] fseek
阅读编码恐怖片时,我刚刚又遇到了 FizzBuzz。 原帖在这里:Coding Horror: Why Can't Programmers.. Program? 对于那些不知道的人:FizzBu
我是一名优秀的程序员,十分优秀!