从C++调用网络摄像头并在 Python 中显示图像

Call a webcam from C++ and show images in Python

本文关键字:Python 显示 显示图 图像 C++ 调用 网络 摄像头      更新时间:2023-10-16

我想在 Python 中从 C++ 调用一个函数。

就我而言,我已经有很多 Python 代码,但我想更改我使用的相机。某些相机库仅支持C++。

我已经成功地调用了C++ .dll并使用我的代码在 Python 中显示图像,如下所示。但是,当Python显示图像时非常慢。

我认为它变得很慢,因为我需要在循环中调用视频捕获。 如果我只输入 VideoCapture 1 次(在 main 函数之前(,图像也只在 Python 中发送 1 次。

这是我的C++代码

#include <iostream>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <vector>
#include <opencv2opencv.hpp>
#include <opencv2highguihighgui.hpp>
using namespace std;
using namespace cv;
Mat img;
Mat frameRGB;
vector<Mat>ch;
Mat1f datas, datas2, datas3, datas4;
float tmp_buf[640 * 480 * 3];
int tmp_buf_sz = 0;
VideoCapture cap;
#define LIBDLL extern "C" __declspec(dllexport)
LIBDLL int returnQ(float *data_img, int x)
{
if(x==1)
{
cap.open(0);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
cap.set(CAP_PROP_FPS, 30);
}
cap >> frameRGB;
img = frameRGB.clone();
split(img, ch);
ch[0].convertTo(datas, CV_32F);
datas = datas.reshape(1, 1).t();
ch[1].convertTo(datas2, CV_32F);
datas2 = datas2.reshape(1, 1).t();
ch[2].convertTo(datas3, CV_32F);
datas3 = datas3.reshape(1, 1).t();
vconcat(datas, datas2, datas4);
vconcat(datas4, datas3, datas4);
tmp_buf_sz = 640 * 480 * 3;
memcpy(data_img, datas4.data, sizeof(float)*tmp_buf_sz);
waitKey(1);
return *data_img;
}

还有我的 Python 代码:

import cv2
import ctypes
from ctypes import * 
import numpy as np
dll = cdll.LoadLibrary(r"./UVCStreamerTest.dll")
dll.returnQ.restype = c_int
data_img = (c_float * 921600)()
x=1
while(True):
ss = dll.returnQ(data_img, x)
if ss!=0:   
x=0
im = np.array(data_img)
im = np.uint8(im)
# Convert to BGR
B = im[0:640*480]
G = im[(640*480):(640*480*2)]
R = im[(640*480*2):]
B = B.reshape(480, 640)
G = G.reshape(480, 640)
R = R.reshape(480, 640)
img = cv2.merge((B,G,R))    
cv2.imshow("Image",img)
cv2.waitKey(1)

有没有办法在C++和Python之间更好地沟通?

当C++的任务是激活相机并将图像发送到Python时。

来自C++的网络摄像头呼叫只是C++和Python之间通信的一个例子。如果成功,我将更换我的相机,该相机在C++中使用UVC相机的特定库。 流程图将是相同的,C++从相机捕获图像并发送到Python,然后Python显示图像。

提前谢谢你。

编辑: 我找到了解决方案。 只需要添加: cap.open(0(

我编辑上面的代码,以防有人遇到同样的问题。

查看 Boost.Python

我认为它比"cdll.LoadLibrary(("更方便