基于python版本的C++python扩展的输出差异

Differences in outputs from C++ python extension based on python version

本文关键字:输出 扩展 C++python python 版本 基于      更新时间:2023-10-16

我最近遇到了为我的项目识别OpenCV的VideoCapture()的哪个设备(设备名称)与哪个源输入(设备索引)相关联的需要。

由于我使用的是OpenCV的Python端口(根据PyCharm,v3.3.0.10),根据我的研究工作,有各种后端功能显然无法从Python中进行操作。

在Windows 10 Home 64位上,使用Python 3.6.3,我发现了肖玲所做的这项方便的工作,它创建了一个专门的Python2扩展程序来满足我的需求。在使用Python3的文档对C++文件进行了rustling以使其与Python3兼容之后,它成功地编译了。然后我进行了一次测试,结果达到了我的预期。

完全出于好奇,并且手头有Python 2.7.14(注意:根据PyCharm的说法,我的Python2也安装了OpenCV v3.3.0.10),我继续使用相同的setup.py为Python2编译了相同的C++扩展。它编译成功了,然后,我运行了相同的test.py…但得到了不同的结果。

当我为Python 3运行test.py时,结果(正确地)如下:

注意:在等待用户输入时,我在运行时停止了代码

OpenCV version: 3.3.0
0: DroidCam Source 3
1: Integrated Webcam
Select a camera (0 to 1):
Process finished with exit code 1

而且,Python 2的结果…也"正确":

OpenCV version: 3.3.0
0: DroidCam Source 3
1: Integrated Webcam
2: DroidCam Source 1
3: DroidCam Source 2
4: DroidCam Source Mini (240p)
Select a camera (0 to 4): 
Process finished with exit code 1

我的笔记本电脑上的摄像头设置如下:

  1. 我的笔记本电脑的集成摄像头
  2. 我的手机(华为P9)使用DroidCamX(v6.4.8)

注意:DroidCamX有一个桌面应用程序,可以与Android DroidCamX应用程序配合使用

注意2:我通过(物理/有线)USB连接使用DroidCamX

事实上,我只使用了两个物理相机——(预期的)设备索引01——这使得Python3的输出完全正确,因此可以按预期工作。然而,使用Python2,当我访问设备索引2-4时,所有这些都会从我的手机返回一个"正确"的视频提要,包括指定240p视频提要的索引4

因此,我的问题;为什么Python2和Python3的输出不同?为什么Python2显示了3个其他可用的视频源(看起来都是"正确的")?

注意:"正确"是指在正确的模式下使用正确的物理设备,尽管在物理相机的数量方面不正确

注意2:所有代码都使用超链接链接到此问题,以尽量缩短此问题的长度

DroidCam Source 1、2和Mini(240p)是DirectShow视频源过滤器。我认为python 3要么不支持DirectShow,要么默认情况下以某种方式禁用了它的使用。Source 3和集成的网络摄像头使用完整的内核驱动程序。