主要目标:使OpenCV在没有SWIG和第三方库的情况下在Go中工作(一个在linux中使用Go比较映像的应用程序)
我是所有套件中的新成员(OpenCv,Go和linux)
makefile:5: /usr/local/go/bin/src/make.amd 64:没有这样的文件或目录 makefile:6: /usr/local/go/bin/src/Make.pkg:没有这样的文件或目录 makefile:8:*缺少分隔符。停止播放。
makefile如下所示
GOROOT=/usr/local/go/bin
GOARCH=amd64
TARG=foo
CGOFILES=foo.go
include $(GOROOT)/src/Make.$(GOARCH)
include $(GOROOT)/src/Make.pkg
foo.o:foo.cpp
g++ $(_CGO_CFLAGS_$(GOARCH)) -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $<
cfoo.o:cfoo.cpp
g++ $(_CGO_CFLAGS_$(GOARCH)) -fPIC -O2 -o $@ -c $(CGO_CFLAGS) $<
CGO_LDFLAGS+=-lstdc++
$(elem)_foo.so: foo.cgo4.o foo.o cfoo.o
gcc $(_CGO_CFLAGS_$(GOARCH)) $(_CGO_LDFLAGS_$(GOOS)) -o $@ $^ $(CGO_LDFLAGS) 非常感谢
发布于 2014-09-23 16:25:27
如果不自己编写C包装器(+ cgo)或使用SWIG,就不能调用C++代码,这是可悲的。
你链接的那篇文章已经过时了,不能再用了。
另一方面,你可以在纯go中开始重写opencv,速度差异不会太大,特别是如果你学习如何使用不安全的速度关键部件。
不建议使用不安全的免责声明,因为它是不安全的。
发布于 2014-09-24 23:50:41
您可以这样做,为了我自己的目的,我已经将OpenCV的一个非常微不足道的子集移植到Go中。通常,这个过程是分配堆上的所有内容,并将其返回为the‘d void*。例如:
typedef void* gocv_matrix;从那里开始,你的很多工作都是传递函数。一个非常重要的注意事项是,您的头文件必须是纯C,并且必须(递归地)包含纯C的头文件。这意味着您的头将主要是原型/前向声明。
因此,头mat.h中的一些矩阵方法看起来可能如下所示
gocv_matrix newMatrix();
void add(gocv_matrix m1, gocv_matrix m2, gocv_matrix dst);
void destroy(gocv_matrix m);然后,您在mat.cxx中的实现将类似于
//include all relevant C++ OpenCV headers directly
gocv_matrix newMatrix() {
cv::Matrix *mat = new cv::Matrix();
return (gocv_matrix)mat;
}
void add(gocv_matrix m1, gocv_matrix m2, gocv_matrix dst) {
cv::Matrix *a = (cv::Matrix *)m1;
cv::Matrix *b = (cv::Matrix *)m2;
cv::Matrix *dstMat = (cv::Matrix *)dst;
(*dstMat) = (*a)+(*b);
}
void destroy(gocv_matrix m) {
cv::Matrix *a = (cv::Matrix *)(m1);
delete a;
}(免责声明:这里的确切代码没有验证正确性,这只是要点)。
几个特别注意事项:
var而不是const。Mytype类型成为包含C.mytype的简单结构而不是实际转换来减少这种情况。老实说,您可能应该只使用SWIG,因为这基本上已经是它对您所做的,除了额外的细节,比如在大多数情况下为您生成实际的Go常量,而不是粗略的var魔术。
https://stackoverflow.com/questions/25999768
复制相似问题