opencv - 在 Go 中访问原始 C 结构上的字段

标签 opencv go

我正在尝试使用 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,您将无法执行此操作。这里有一些障碍:

  1. 导入包时,you can only use identifiers that have been exported .在这种情况下,data 不是以大写字母开头,因此不会导出。

  2. 即使它是一个导出的标识符,你也会遇到麻烦,因为 Go 不支持联合。因此,该字段由与底层 C 联合的大小相匹配的字节数组表示(在本例中为 8 个字节,与 64 位指针的大小相匹配)。

  3. 最后,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/

相关文章:

android - 使用 ndk 运行 android 应用程序时出现运行时错误

opencv - KAZE和AKAZE中的 Octave 音阶和子音阶是什么?

image-processing - 一组3D模型点与其图像投影之间的对应关系

python - 使用 numpy 确定 RGB 图像的某些部分是彩色还是灰度

go - 如何生成正确的 RSA key 来签署 JWT?

go - net包中listen、read和write函数的区别

go - 无法在 Intellij 2020.1 中的 golang 包中设置断点

opencv - 访问矩阵A的像素值

http - nginx 反向代理上的应用程序重定向错误

go - 在 Go 中使用 fmt.Printf 打印多个内容