从C++ OpenCV 3.0调用Python

3
我正在使用PiCam获取视频流,但是想尝试将该流传输到C++进行处理。
Python代码:
import time
import picamera
import picamera.array
import cv2

with picamera.PiCamera() as camera:
    camera.start_preview()
    time.sleep(2)
    with picamera.array.PiRGBArray(camera) as stream:
        camera.capture(stream, format='bgr')
        # At this point the image is available as stream.array
        image = stream.array

那么,在我的.cpp文件中该怎么做呢? 我一直在研究boost::python,但他们的文档很烂。

将numpy数组发送是否比在Python代码中直接转换为Cv.Mat并从C++调用它有任何好处吗? 像这样

有任何问题吗? 非常感谢您的帮助!

编辑:忘记提到了,已经尝试过this,但没有成功。 现在找到了pyopencv_to()和pyopencv_from(),但不确定如何使用?抱歉,我是新手。 (会链接上面的pyopencv_,但不能发布超过两个链接。)


读了那个,但不确定如何操作。我的Python代码不是得到了一个numpy数组吗?需要在C++中使用cv::mat来处理图像。 - bac
如果你只能得到一个numpy数组,我建议直接提取其底层数据缓冲区并进行转换。可能需要检查某些Numpy标志,例如连续性、owndata等,但我猜相机库应该保证你不会得到由其他东西拥有的“打洞”数组...? - Cong Ma
是的,但可以使用cv.fromarray()将numpy数组转换为Cv.Mat,如我上面链接的那样。但不确定这是否是最好的方法?我的意思是,例如我不知道它是否是一个缓慢的过程.. - bac
我在想,直接从相机获取数据会不会比这个慢。但无论如何,我开始认为在C/C++应用程序中嵌入等效于几行Python代码的功能可能会过度杀伤它...为什么不直接在您的C++应用程序中与相机通信呢? - Cong Ma
主要是因为我不知道如何以与Python库picamera相同(或更好)的方式完成它。使用上述代码,我可以获得基本无延迟的图像,这在其他方式下使用PiCam非常难以实现。有什么建议吗? - bac
1个回答

3

我通过使用管道自己解决了这个问题。想着我应该分享一下我的解决方案:

C ++ 端:

union pipe
{
    uint8_t image[height] [width] [colors];
    uint8_t data [height * width * colors];
} raw;

int main(){
    // Reads in the raw data
    fread(&raw.image, 1, sizeof(raw.data), stdin);

    // Rebuild raw data to cv::Mat
    image = Mat(height, width, CV_8UC3, *raw.image);
}

Python方面:(刚刚在上述代码末尾添加了此内容)

sys.stdout.buffer.write(image.tostring())

在终端中输入以下命令来运行它:
python img.py | ./img

对我来说运行得非常好!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接