yanghn2002

View My GitHub Profile

在 Github 上面两个项目 Hikrobot OpenCV CPPHikrobot OpenCV Python 其实算是一个项目吧,一个是海康工业相机的 C++ 库,另一个就是它的 Python-NumPy wrapper 。

想法

来源很简单,就是工作上需要把图像在前端展示给客户,然后客户有图像算法,最后坐标给过来引导机器人运动。所以由于客户的需求就不能用海康自己的软件了,就写了这个东西把海康自己的 C SDK 读到 OpenCV 的 cv::Mat 图像里面去。

buffer

首先的问题就是我要处理不同的颜色通道,之前有一个同事就一直说他怎么读到的都是黑白的但其实不是。我看到相机读到的 frame 是给到了一个 MvGvspPixelType 枚举的,我就跟着这个定义,看到可以提取出 pixel_size 以及可以判断 MV_GVSP_PIX_MONO 还是 MV_GVSP_PIX_COLOR ,那就可以了,我就直接对应到了 OpenCV :

int cv_pixel_type;
unsigned pixel_size = (MV_GVSP_PIX_EFFECTIVE_PIXEL_SIZE_MASK&pixel_type)>>MV_GVSP_PIX_EFFECTIVE_PIXEL_SIZE_SHIFT;
switch(pixel_type&MV_GVSP_PIX_COLOR_MASK) {
    case MV_GVSP_PIX_MONO: {
        cv_pixel_type = CV_MAKETYPE(pixel_size, 1);
    }   break;
    case MV_GVSP_PIX_COLOR: {
        cv_pixel_type = CV_MAKETYPE(pixel_size/3, 3);
    }   break;
        default: throw PixelTypeError();
}

然后我就想到了,同事可能是把彩色图像按照 size 直接读了,所以只是在视觉上是黑白的,实际上不同通道被读到一起去了,也许……

剩余工作

说实话这个问题解决的其他东西都不重要,就是考虑到需要多个相机,所以添加一个枚举然后通过 indexserial_number 来创建 CvCapture 实例,这是模仿 librealsense 。
然后 Python 无非就是 pybind11 ,而且由于我的 CvContext 是一个单例,所以 Python 的枚举我就直接做成一个函数了:

hik::MvContext::DeviceIndex enum_devices(void) {
    return hik::MvContext::instance().enumDevices();
}