从C++调用网络摄像头并在 Python 中显示图像
Call a webcam from C++ and show images in Python
我想在 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(("更方便
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- Pybind11:将元组列表从Python传递到C++
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 如何在c++中使用引用实现类似python的行为
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 递归列出所有目录中的C++与Python与Ruby的性能
- IPC使用多个管道和分支进程来运行Python程序
- 从python中调用C++函数并获取返回值
- 程序崩溃并显示"std::out_of_range"错误
- Python 3.7 和 excess_args 的 SWIG 问题
- Python中的for循环与C++有何不同
- 从C++调用网络摄像头并在 Python 中显示图像
- Python swig包装的向量的向量的双显示为元组
- 在python中使用暴露的elbp函数后,无法显示LBP图像
- Outlook -从显示名称获取电子邮件地址.可以在Python中工作,而不是C
- Python模拟显示慢性能,如何加快数组计算速度