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()
相关推荐
网安INF2 小时前
【论文阅读】-《QUERY EFFICIENT DECISION BASED SPARSE ATTACKS AGAINST BLACK-BOX DEEP LEARNING MODELS》
论文阅读·人工智能·深度学习·计算机视觉
不会编程的懒洋洋4 小时前
VisionPro 中 卡尺 CogCaliperTool
图像处理·人工智能·笔记·计算机视觉·visionpro·cogcalipertool
不会编程的懒洋洋5 小时前
VisionPro 中 直方图 CogHistogramTool
图像处理·人工智能·笔记·计算机视觉·机器视觉·visionpro·康耐视
冬奇Lab6 小时前
一天一个开源项目(第102篇):NVIDIA Video Search and Summarization - 构建 GPU 加速的视觉智能体
人工智能·计算机视觉·开源
胖墩会武术7 小时前
【OWLv2】开放词汇目标检测
人工智能·目标检测·计算机视觉
sali-tec7 小时前
C# 基于OpenCv的视觉工作流-章72-点-点距离
图像处理·人工智能·opencv·算法·计算机视觉
羊羊小栈1 天前
基于「YOLO目标检测 + 多模态AI分析」的篮球动作规范智能检测分析预警系统
人工智能·yolo·目标检测·计算机视觉·毕业设计·大作业
Hua-Jay1 天前
OpenCV联合C++/Qt 学习笔记(二十)----Harri角点检测、Shi-Tomas角点检测及亚像素级别角点位置优化
c++·笔记·qt·opencv·学习·计算机视觉
armwind1 天前
数字图像处理-2-二值化,投影,灰度变换,直方图
计算机视觉
埃科光电1 天前
应用分享丨16K光口彩色TDI线阵相机筑牢高端PCB质量防线
图像处理·计算机视觉·相机·pcb工艺