我正在尝试使用Go中的OpenCV。 OpenCV定义了一个具有CvMat
字段的结构data
:
typedef struct CvMat
{
...
union
{
uchar* ptr;
short* s;
} data;
}
我正在使用opencv找到here的go绑定。这有CvMat
的类型别名:
type Mat C.CvMat
现在我有一个Mat
对象,我想访问它上面的data
字段。我怎样才能做到这一点?如果我尝试访问_data
,则无效。我使用Mat
包打印了reflect
对象上的字段,并得到了这个:
...
{data github.com/lazywei/go-opencv/opencv [8]uint8 24 [5] false}
...
因此它上面有一个data
字段,但它甚至不是同一类型。这是一个8 uint8
的数组!我正在寻找一个超过8个字符的uchar*
。我如何进入uchar
?
答案 0 :(得分:3)
简短的回答是,如果不修改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
会为您提供的信息提供一个访问器(可能是一个可以检查联盟的哪个分支正在使用的访问者,而不是默默地返回错误数据。我建议您提交错误报告在包装上(可能带有补丁),或者如果您需要该功能,请创建一个包含所需修改的私人副本。