我正在尝试使用 Go 中的 OpenCV。 OpenCV 定义了一个结构 CvMat
,它有一个 data
字段:
typedef struct CvMat
{
...
union
{
uchar* ptr;
short* s;
} data;
}
我正在使用 opencv 的 go 绑定(bind),发现 here .这有一个 CvMat
的类型别名:
type Mat C.CvMat
现在我有一个 Mat
对象,我想访问它的 data
字段。我怎样才能做到这一点?如果我尝试访问 _data
,它不起作用。我用 reflect
包打印出 Mat
对象上的字段并得到了这个:
...
{data github.com/lazywei/go-opencv/opencv [8]uint8 24 [5] false}
...
所以它上面有一个data
字段,但它甚至不是同一个类型。这是一个包含 8 个 uint8
的数组!我正在寻找一个超过 8 个字符的 uchar*
。我如何获得此 uchar
?
最佳答案
简短的回答是,如果不修改 go-opencv
,您将无法执行此操作。这里有一些障碍:
导入包时,you can only use identifiers that have been exported .在这种情况下,
data
不是以大写字母开头,因此不会导出。即使它是一个导出的标识符,你也会遇到麻烦,因为 Go 不支持联合。因此,该字段由与底层 C 联合的大小相匹配的字节数组表示(在本例中为 8 个字节,与 64 位指针的大小相匹配)。
最后,it is strongly recommended not to expose
cgo
types from packages .因此,即使在这种可以直接访问底层 C 结构的情况下,我也建议不要这样做。
理想情况下,go-opencv
会为您之后的信息提供一个访问器(大概是一个可以检查联合的哪个分支正在使用的访问器,而不是默默地返回错误数据。我建议您要么提交关于包的错误报告(可能带有补丁),要么创建一个包含所需修改的私有(private)副本,如果您立即需要该功能。
关于opencv - 在 Go 中访问原始 C 结构上的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840952/