【问题标题】:Call Python from C++ OpenCV 3.0从 C++ OpenCV 3.0 调用 Python
【发布时间】:2022-03-16 16:24:34
【问题描述】:

所以我使用 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++ 调用它有什么好处? Like this.

有什么问题吗? 感谢所有帮助!

编辑:忘了说,试过this没有成功。 现在找到了pyopencv_to()和pyopencv_from(),但是不知道怎么用?抱歉,这个是新手。 (会链接上面的pyopencv_,但不允许发布两个以上的链接。)

【问题讨论】:

  • 阅读,但不确定如何。我的 Python 代码没有给我一个 numpy 数组吗?需要 C++ 中的 cv::mat 来处理图像。
  • 如果你能得到的只是一个 numpy 数组,我想说直接拉出它的底层数据缓冲区数组并转换它。可能需要检查某些 Numpy 标志,例如连续性、自己的数据等,但我猜相机库应该保证你不会得到其他东西拥有的“穿孔”数组......?
  • 是的,但是可以使用上面链接的 cv.fromarray() 将 numpy 数组转换为 Cv.Mat。但不确定这是否是最好的方法?我的意思是,我不知道这是否是一个缓慢的过程..
  • 我想知道它是否比从相机中获取数据要慢。但无论如何,我开始认为在 C/C++ 应用程序中嵌入相当于几行 Python 行的功能可能会过度杀伤它……为什么不直接在 C++ 应用程序中与相机对话呢?

标签: python c++ raspberry-pi2 opencv3.0


【解决方案1】:

我自己通过管道解决了这个问题。认为我应该分享我的解决方案:

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

对我来说真的很好用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 2013-10-08
    • 2017-01-23
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多