使用OpenCV-Python外接摄像头打不开问题

使用OpenCV-Python外接摄像头打不开

情况描述

使用OpenCV-Python打开摄像头常用的代码是这样的:

import cv2 as cv
cap = cv.VideoCapture(0)
flag = cap.isOpened()
while (flag):
    ret, frame = cap.read()

笔者采用这种方法来打开电脑自带的摄像头是没有问题的,但是近期购入的一个新的摄像头,发现采用这种方式打开会提示:

 WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1113) SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -1072875772
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1125) SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -1072875772
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1159) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -1072875772
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback

经查阅资料
在这里插入图片描述
找到了问题所在,采用默认的API控制出错。

解决方法

在VideoCapture后加上cv.CAP_DSHOW
修正后代码如下:

import cv2 as cv


cap = cv.VideoCapture(1,cv.CAP_DSHOW)  #更改API设置
flag = cap.isOpened()

index = 1
while (flag):
    ret, frame = cap.read()
    frame = cv.flip(frame, 1)  # 水平翻转
    cv.imshow("Capture_Paizhao", frame)
    k = cv.waitKey(1) & 0xFF
    if k == ord('s'):  # 按下s键,进入下面的保存图片操作
        cv.imwrite(r"F:\PyCharm\Camera calibration\Aruco_Identify\0" + str(index) + ".jpg", frame)
        print(cap.get(3))
        print(cap.get(4))
        print("save" + str(index) + ".jpg successfuly!")
        print("-------------------------")
        index += 1
    elif k == ord('q'):  # 按下q键,程序退出
        break
cap.release()
cv.destroyAllWindows()

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
下面是一个使用OpenCV-Python库识别石头剪刀布手势的示例代码: ```python import cv2 import numpy as np import math # 定义区域的颜色上下限 lower = np.array([0, 20, 70], dtype=np.uint8) upper = np.array([20, 255, 255], dtype=np.uint8) # 开启摄像头 cap = cv2.VideoCapture(0) while True: # 读取一帧 ret, frame = cap.read() if not ret: break # 镜像翻转 frame = cv2.flip(frame, 1) # 转换到HSV空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 创建掩膜 mask = cv2.inRange(hsv, lower, upper) # 进行图像形态学操作 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11, 11)) mask = cv2.erode(mask, kernel, iterations=2) mask = cv2.dilate(mask, kernel, iterations=2) # 找到轮廓 contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 如果找到了轮廓 if len(contours) > 0: # 找到最大的轮廓 contour = max(contours, key=cv2.contourArea) # 计算轮廓的外接圆 ((x, y), radius) = cv2.minEnclosingCircle(contour) # 计算轮廓的重心 M = cv2.moments(contour) center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # 绘制重心和外接圆 cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2) cv2.circle(frame, center, 5, (0, 0, 255), -1) # 如果半径大于10 if radius > 10: # 计算手势方向 rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(frame, [box], 0, (0, 255, 0), 2) x1, y1 = box[0] x2, y2 = box[1] angle = math.atan2(y2 - y1, x2 - x1) * 180.0 / math.pi if angle < 0: angle += 180 if angle <= 60: gesture = "scissors" elif angle <= 120: gesture = "rock" else: gesture = "paper" # 在屏幕上显示手势 cv2.putText(frame, gesture, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 255), 2) # 显示结果 cv2.imshow("Frame", frame) cv2.imshow("Mask", mask) # 按下q键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头 cap.release() # 关闭所有窗口 cv2.destroyAllWindows() ``` 代码中使用红色的石头剪刀布手势进行演示,可以根据实际情况调整颜色区间。使用此代码时需要安装OpenCV-Python库,可以通过以下命令进行安装: ``` pip install opencv-python ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hurri_cane

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值