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()
相关推荐
我没胡说八道8 小时前
高校论文AI检测优化工具对比研究与实测分析(2026)
人工智能·深度学习·机器学习·计算机视觉·aigc·论文
探物 AI9 小时前
把 MambaOut 塞进 YOLOv11:会有什么样的反应
python·yolo·计算机视觉
我最爱吃鱼香茄子16 小时前
终极方案:JetBrains IDE永久解放C盘空间
计算机视觉·性能优化·电脑·笔记本电脑·intellij-idea·程序员创富·webstorm
玖釉-17 小时前
Vulkan 离屏渲染详解:从 Framebuffer 到后处理、阴影贴图与 Render Texture
c++·windows·计算机视觉·图形渲染
路人甲32618 小时前
SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control
人工智能·深度学习·计算机视觉·机器人·具身智能
armwind19 小时前
openISP学习8-GC — Gamma Correction(Gamma 校正)
图像处理·计算机视觉
大江东去浪淘尽千古风流人物19 小时前
【VGGT-Ω】前馈式3D重建的规模化之路:Register Attention、自监督训练与10B参数Scaling Law深度解析
深度学习·计算机视觉·transformer·slam·vio·3d重建
断眉的派大星19 小时前
YOLO26 完整学习笔记:从 Anchor-Free、TAL、STAL 到端到端无 NMS 部署
人工智能·笔记·学习·yolo·目标检测·计算机视觉·目标跟踪
却道天凉_好个秋21 小时前
HEVC(六):CTC
人工智能·计算机视觉·hevc·ctc
FOORIR 客流统计1 天前
客流统计系统的工程实现:从线穿越计数到多目标跟踪
人工智能·计算机视觉·目标跟踪