mingW32环境用opencv测摄像头

mingW32

参考

sdl安装测试-mingw32环境

vcpkg 安装依赖

bash 复制代码
# 按需安装
vcpkg install opencv4[core,highgui,calib3d,jpeg,png,webp,dshow,thread,win32ui,fs]:x86-mingw-dynamic

# 或者 全量安装
vcpkg install opencv4[all]:x86-mingw-dynamic

安装的动态库添加到环境变量PATH

bash 复制代码
D:\soft\vcpkg\installed\x86-windows\bin
D:\soft\vcpkg\installed\x86-mingw-dynamic\bin

测试

CMakeLists.txt

bash 复制代码
cmake_minimum_required(VERSION 3.20)
project(untitled21)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(OpenCV_INCLUDE_DIR "D:/soft/vcpkg/installed/x86-mingw-dynamic/include/opencv4")
set(OpenCV_LIB_DIR "D:/soft/vcpkg/installed/x86-mingw-dynamic/lib")

add_executable(${PROJECT_NAME} main.cpp)

target_include_directories(${PROJECT_NAME} PRIVATE
        ${OpenCV_INCLUDE_DIR}
)

target_link_libraries(${PROJECT_NAME} PRIVATE
        ${OpenCV_LIB_DIR}/libopencv_core4.dll.a
        ${OpenCV_LIB_DIR}/libopencv_imgproc4.dll.a
        ${OpenCV_LIB_DIR}/libopencv_highgui4.dll.a
        ${OpenCV_LIB_DIR}/libopencv_imgcodecs4.dll.a
        ${OpenCV_LIB_DIR}/libopencv_videoio4.dll.a
)

main.cpp

c 复制代码
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

int main() {
    cv::VideoCapture cap(0); // 0 = 默认摄像头
    if (!cap.isOpened()) {
        std::cerr << "无法打开摄像头!" << std::endl;
        return -1;
    }

    std::cout << "摄像头已打开,按 Q 退出" << std::endl;

    cv::Mat frame;
    while (true) {
        cap >> frame;
        if (frame.empty()) break;

        cv::imshow("Camera", frame);

        if (cv::waitKey(1) == 'q') break;
    }

    cap.release();
    cv::destroyAllWindows();
    return 0;
}

python

pip 安装官方 OpenCV Python

bash 复制代码
pip install opencv-python

main.py

py 复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2
import time
import os

# 静默日志,避免 obsensor 报错
os.environ["OPENCV_LOG_LEVEL"] = "SILENT"

def list_cameras(max_index=5):
    """
    列出可用的摄像头索引
    """
    print("正在检测可用的摄像头...")
    available_cameras = []

    for i in range(max_index):
        cap = cv2.VideoCapture(i, cv2.CAP_DSHOW)  # Windows 推荐 DirectShow 后端
        if cap.isOpened():
            ret, frame = cap.read()
            if ret:
                width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
                height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
                fps = cap.get(cv2.CAP_PROP_FPS)
                if fps == 0:
                    fps = 30  # 默认值
                print(f"摄像头 {i}: {width}x{height} @ {fps:.1f}fps")
                available_cameras.append(i)
            cap.release()
    if not available_cameras:
        print("未检测到可用摄像头")
    else:
        print(f"可用摄像头: {available_cameras}")
    return available_cameras

def test_camera(camera_index=0):
    """
    打开指定摄像头并显示实时画面
    """
    cap = cv2.VideoCapture(camera_index, cv2.CAP_DSHOW)
    if not cap.isOpened():
        print(f"错误:无法打开摄像头 {camera_index}")
        return False

    # 设置分辨率(可选)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

    print("摄像头已成功打开!")
    print("按 'q' 键退出,按 's' 键保存当前帧")

    frame_count = 0
    prev_time = time.time()

    while True:
        ret, frame = cap.read()
        if not ret:
            print("错误:无法读取视频帧")
            break

        frame_count += 1

        # 计算 FPS
        curr_time = time.time()
        fps = 1 / (curr_time - prev_time)
        prev_time = curr_time

        # 在图像上显示帧计数和 FPS
        cv2.putText(frame, f'Frame: {frame_count}', (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        cv2.putText(frame, f'FPS: {fps:.1f}', (10, 70),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2)

        # 显示图像
        cv2.imshow('摄像头测试', frame)

        key = cv2.waitKey(1) & 0xFF

        if key == ord('q'):
            print("用户请求退出")
            break
        elif key == ord('s'):
            filename = f'capture_{frame_count}.jpg'
            cv2.imwrite(filename, frame)
            print(f"已保存图片: {filename}")

    cap.release()
    cv2.destroyAllWindows()
    print(f"测试完成,共处理了 {frame_count} 帧")
    return True

def main():
    print("OpenCV 摄像头测试程序")
    print("="*40)
    print(f"OpenCV 版本: {cv2.__version__}")

    cameras = list_cameras()

    if not cameras:
        print("没有找到可用的摄像头,程序退出")
        return

    # 自动选择第一个摄像头
    camera_index = cameras[0]

    print(f"\n正在测试摄像头 {camera_index}...")
    test_camera(camera_index)

    print("程序结束")

if __name__ == "__main__":
    main()
相关推荐
ccut 第一混8 小时前
python opencv 计算 色坐标(CIE 1931 )
opencv·计算机视觉
m0_743106469 小时前
【浙大&南洋理工最新综述】Feed-Forward 3D Scene Modeling(五)
人工智能·算法·计算机视觉·3d·几何学
ZPC82101 天前
fanuc 机器人通过PR寄存器实现轨迹控制
人工智能·算法·计算机视觉·机器人
AI人工智能+1 天前
文档抽取系统结合OCR技术与大语言模型,有效解决档案数字化与知识化利用之间的矛盾
人工智能·计算机视觉·ocr·文档抽取
深度学习lover1 天前
<数据集>yolo 焊接缺陷识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·焊接缺陷检测
军军君011 天前
【人工智能/AI】项目实战二:AI视频生成产品汇总(非完全)
图像处理·人工智能·计算机视觉·ai作画·视觉检测·文心一言
一休哥※1 天前
YOLOv11改进系列 | 引入EMO ICCV2023的C3k2_iRMB模块,轻量注意力残差混合块增强C3k2,多尺度分割更稳更准
深度学习·yolo·计算机视觉
森诺Alyson1 天前
前沿技术借鉴研讨-2026.4.16(视觉语言模型/医学影像文本多模态对齐)
论文阅读·人工智能·经验分享·计算机视觉·语言模型
jay神1 天前
鸟类识别数据集 - CUB_200
人工智能·深度学习·目标检测·计算机视觉·目标跟踪·毕业设计
yong99901 天前
基于直方图优化的图像去雾技术MATLAB实现
人工智能·计算机视觉·matlab