简介
使用 OpenCV 库时, 在末了调用cv::destroyAllWindows()之后装备管理器中的摄像头装备消失了, 看看是怎么触发的, 后面再慢慢研究RootCause是什么。
步调
装备管理器原来摄像头显示
1. 代码
- main.cpp
- Note:
- 1. haarcascade_frontalface_default.xml 在编译的opencv目录下可以找到
- 2. 源码缺少就注释掉就可以, 缺少部分是保存图像的,不影响。
复制代码- #include <opencv2/opencv.hpp>
- #include <iostream>
- #include "base.h"
- using namespace cv;
- using namespace std;
- string gTempFileName;
- void humanface(Mat &image)
- {
- // 2. 转换为灰度图
- Mat gray;
- cvtColor(image, gray, COLOR_BGR2GRAY);
- if (opencv_SaveImage(gray, gTempFileName))
- {
- cout << "gray save to " << gTempFileName << endl;
- }
- // 3. 加载级联分类器
- CascadeClassifier face_cascade;
- // face_cascade.load("E:/Workspace/Qt/opencv_demos/images/haarcascade_frontalface_alt.xml");
- // face_cascade.load("E:/Workspace/Qt/opencv_demos/images/haarcascade_frontalface_alt2.xml");
- face_cascade.load("E:/Workspace/Qt/opencv_demos/images/haarcascade_frontalface_default.xml");
- // 4. 检测人脸
- std::vector<Rect> faces;
- double scale_factor = 1.1;
- int min_neighbors = 3;
- Size min_size(30, 30);
- Size max_size(0, 0);
- face_cascade.detectMultiScale(gray, faces, scale_factor, min_neighbors, 0 | CASCADE_SCALE_IMAGE, min_size, max_size);
- // 5. 绘制矩形框
- for (size_t i = 0; i < faces.size(); i++) {
- Rect face_rect = faces[i];
- rectangle(image, face_rect, Scalar(255, 0, 0), 2, 8, 0);
- cout << i << endl;
- }
- if (opencv_SaveImage(image, gTempFileName))
- {
- cout << "rect save to " << gTempFileName << endl;
- }
- }
- int main()
- {
- VideoCapture cap(0);
- Mat img;
- if(!cap.isOpened()) { // 检查摄像头是否成功打开
- cerr << "Error: Cannot open camera" << endl;
- return -1;
- }
- while (true) {
- cap.read(img);
- if(img.empty()){
- cerr << "Could not read the image" << endl;
- break; // 如果无法读取图像,则退出循环
- }
- humanface(img);
- imshow("Image", img);
- // 等待任意键按下,时间设置为 1ms,这样程序可以快速响应按键
- int key = waitKey(1);
- cout<<key<<endl;
- if(key == 27) { // 如果按下的是 ESC 键 (ASCII 码为 27)
- break; // 退出循环
- }
- }
- // 释放 VideoCapture 对象
- cap.release();
- cv::destroyAllWindows();
- return 0;
- }
复制代码 2. 运行代码
- 第一次 正常打开摄像头并且使用;
- 再次运行时出现无法打开摄像头, 装备管理器没有摄像头装备
Error: Cannot open camera
需要注意的是, 接上有线耳机线, 出现概率高, 不接耳机线很难出现(有出现过一次,后面没再重现,再后面发现跟当时使用录屏软件,Camtasia这个软件应该有音频操纵吧)。
3. 不接耳机线反复测试
一百次并没有出现题目。
OpenCV 配置文件
下面是编译OpenCV源码时的设置
cvconfig.h 位于编译后的include/opencv2/cvconfig.h,
这里提供这个文件是考虑编译参数可能会有不一样的效果, 以是可能你的不会出现, 大概PC的缘故, 以是尽可能陈述更多消息方便举行交叉比较。
总结
初步怀疑是跟硬件相关, 毕竟飞行堡垒8硬件题目许多。
出现题目后面研究发现
1. 接入有线耳机时会触发题目。
2. 使用录屏软件正在录屏时出现题目。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |