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()
相关推荐
AEIC学术交流中心6 分钟前
【快速EI检索 | SPIE出版】2026年第六届计算机视觉与模式分析国际会议(ICCPA 2026)
人工智能·计算机视觉
春末的南方城市27 分钟前
亚马逊提出FlowFixer,商品图生成告别模糊Logo和错字,电商广告的“最后一公里”神器来了!
人工智能·深度学习·计算机视觉
羊羊小栈2 小时前
基于「YOLO目标检测 + 多模态AI分析」的桥梁缺陷智能分析监测预警系统
人工智能·yolo·目标检测·计算机视觉·毕业设计·大作业
春末的南方城市2 小时前
CVPR 2026 | 加州大学 × Adobe 联合发布 FaceCam:无4D数据训练下实现单视频精准相机控制,让短视频创作者轻松掌控“电影级”运镜。
人工智能·深度学习·数码相机·机器学习·计算机视觉·aigc
西柚小萌新2 小时前
【计算机视觉CV:目标检测】--5.目标检测数据集
目标检测·计算机视觉·目标跟踪
LittroInno3 小时前
TVMSTofu Video Management System综合视频管理平台
人工智能·计算机视觉·音视频·无人机·低小慢目标
深度学习lover3 小时前
<数据集>yolo骑行者识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉
美狐美颜sdk20 小时前
2026主流直播美颜sdk对比:效果、算法与成本分析
前端·人工智能·计算机视觉·美颜sdk·直播美颜sdk·第三方美颜sdk·视频美颜sdk
EDPJ21 小时前
从 Grounding DINO 到 DINO-X:开放集目标检测的架构演进与细节拆解
目标检测·计算机视觉·架构·图像分割·图像分类
xinxiangwangzhi_1 天前
CREStereo 论文总结(2022)
计算机视觉