opencv 在飞行堡垒8中调用camera导致设备消失

简介

使用 OpenCV 库时, 在最后调用cv::destroyAllWindows()之后设备管理器中的摄像头设备消失了, 看看是怎么触发的, 后面再慢慢研究RootCause是什么。

步骤

设备管理器原来摄像头显示

1. 代码

main.cpp
Note: 
1. haarcascade_frontalface_default.xml 在编译的opencv目录下可以找到 
2. 源码缺少就注释掉就可以, 缺少部分是保存图像的,不影响。
cpp 复制代码
#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. 运行代码

  1. 第一次 正常打开摄像头并且使用;
  2. 再次运行时出现无法打开摄像头, 设备管理器没有摄像头设备
    Error: Cannot open camera
    需要注意的是, 接上有线耳机线, 出现概率高, 不接耳机线很难出现(有出现过一次,后面没再重现,再后面发现跟当时使用录屏软件,Camtasia这个软件应该有音频操作吧)。

3. 不接耳机线反复测试

一百次并没有出现问题。

OpenCV 配置文件

下面是编译OpenCV源码时的设置

cvconfig.h 位于编译后的include/opencv2/cvconfig.h,

这里提供这个文件是考虑编译参数可能会有不一样的结果, 所以可能你的不会出现, 或者PC的缘故, 所以尽可能陈述更多消息方便进行交叉比较。

cpp 复制代码
#ifndef OPENCV_CVCONFIG_H_INCLUDED
#define OPENCV_CVCONFIG_H_INCLUDED

/* OpenCV compiled as static or dynamic libs */
#define BUILD_SHARED_LIBS

/* OpenCV intrinsics optimized code */
#define CV_ENABLE_INTRINSICS

/* OpenCV additional optimized code */
/* #undef CV_DISABLE_OPTIMIZATION */

/* Compile for 'real' NVIDIA GPU architectures */
#define CUDA_ARCH_BIN ""

/* NVIDIA GPU features are used */
#define CUDA_ARCH_FEATURES ""

/* Compile for 'virtual' NVIDIA PTX architectures */
#define CUDA_ARCH_PTX ""

/* AMD's Basic Linear Algebra Subprograms Library*/
/* #undef HAVE_CLAMDBLAS */

/* AMD's OpenCL Fast Fourier Transform Library*/
/* #undef HAVE_CLAMDFFT */

/* Clp support */
/* #undef HAVE_CLP */

/* NVIDIA CUDA Runtime API*/
/* #undef HAVE_CUDA */

/* NVIDIA CUDA Basic Linear Algebra Subprograms (BLAS) API*/
/* #undef HAVE_CUBLAS */

/* NVIDIA CUDA Deep Neural Network (cuDNN) API*/
/* #undef HAVE_CUDNN */

/* NVIDIA CUDA Fast Fourier Transform (FFT) API*/
/* #undef HAVE_CUFFT */

/* DirectX */
#define HAVE_DIRECTX
#define HAVE_DIRECTX_NV12
#define HAVE_D3D11
#define HAVE_D3D10
#define HAVE_D3D9

/* Eigen Matrix & Linear Algebra Library */
/* #undef HAVE_EIGEN */

/* Geospatial Data Abstraction Library */
/* #undef HAVE_GDAL */

/* Halide support */
/* #undef HAVE_HALIDE */

/* Vulkan support */
/* #undef HAVE_VULKAN */

/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1

/* Intel Integrated Performance Primitives */
/* #undef HAVE_IPP */
/* #undef HAVE_IPP_ICV */
/* #undef HAVE_IPP_IW */
/* #undef HAVE_IPP_IW_LL */

/* JPEG-2000 codec */
#define HAVE_OPENJPEG
/* #undef HAVE_JASPER */

/* AVIF codec */
/* #undef HAVE_AVIF */

/* IJG JPEG codec */
#define HAVE_JPEG

/* GDCM DICOM codec */
/* #undef HAVE_GDCM */

/* NVIDIA Video Decoding API*/
/* #undef HAVE_NVCUVID */
/* #undef HAVE_NVCUVID_HEADER */
/* #undef HAVE_DYNLINK_NVCUVID_HEADER */

/* NVIDIA Video Encoding API*/
/* #undef HAVE_NVCUVENC */

/* OpenCL Support */
#define HAVE_OPENCL
/* #undef HAVE_OPENCL_STATIC */
/* #undef HAVE_OPENCL_SVM */

/* NVIDIA OpenCL D3D Extensions support */
#define HAVE_OPENCL_D3D11_NV

/* OpenEXR codec */
#define HAVE_OPENEXR

/* OpenGL support*/
/* #undef HAVE_OPENGL */

/* PNG codec */
#define HAVE_PNG

/* PNG codec */
/* #undef HAVE_SPNG */

/* Posix threads (pthreads) */
#define HAVE_PTHREAD

/* parallel_for with pthreads */
#define HAVE_PTHREADS_PF

/* Intel Threading Building Blocks */
/* #undef HAVE_TBB */

/* Ste||ar Group High Performance ParallelX */
/* #undef HAVE_HPX */

/* TIFF codec */
#define HAVE_TIFF

/* Define if your processor stores words with the most significant byte
   first (like Motorola and SPARC, unlike Intel and VAX). */
/* #undef WORDS_BIGENDIAN */

/* VA library (libva) */
/* #undef HAVE_VA */

/* Intel VA-API/OpenCL */
/* #undef HAVE_VA_INTEL */

/* Lapack */
/* #undef HAVE_LAPACK */

/* Library was compiled with functions instrumentation */
/* #undef ENABLE_INSTRUMENTATION */

/* OpenVX */
/* #undef HAVE_OPENVX */

/* OpenCV trace utilities */
#define OPENCV_TRACE

/* Library QR-code decoding */
/* #undef HAVE_QUIRC */

#endif // OPENCV_CVCONFIG_H_INCLUDED

总结

初步怀疑是跟硬件相关, 毕竟飞行堡垒8硬件问题很多。

出现问题后面研究发现
1. 接入有线耳机时会触发问题。
2. 使用录屏软件正在录屏时出现问题。

相关推荐
路人甲ing..20 天前
在树莓派上使用自带的摄像头采集视频
python·opencv·树莓派·摄像头·微处理器
541板哥2 个月前
STM32--基于STM32F103C8T6的OV7670摄像头显示
stm32·单片机·嵌入式硬件·fifo·摄像头·ov7670·stm32f103c8t6
飞睿科技2 个月前
安防监控摄像头图传模组,1公里WiFi无线传输方案,监控新科技
科技·安防监控·摄像头·飞睿智能·无线传输模块·图传模组·1公里wifi无线传输
我是ed.2 个月前
Cocos 2 使用 webview 嵌入页面,摄像头调用没权限问题
webview·cocos2d·摄像头
astuv3 个月前
在树莓派上部署开源监控系统 ZoneMinder
linux·nginx·树莓派·监控·摄像头·zoneminder·apache2
网络研究院3 个月前
利用人工智能改变视频智能
人工智能·音视频·监控·视频·摄像头·策略·智能
Q21851264497 个月前
高集成IP摄像SOC处理方案简介以及芯片介绍SSC336D
网络·图像处理·网络协议·tcp/ip·摄像头·soc处理
半条-咸鱼9 个月前
语音模块&摄像头模块&阿里云结合,实现垃圾的智能识别
linux·网络·算法·阿里云·云计算·摄像头·智能识别