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()
相关推荐
brooknew2 小时前
Opencv的findcontours函数的大坑
人工智能·opencv·计算机视觉
Sagittarius_A*2 小时前
图像去雾:从直方图增强到暗通道先验【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉·图像去雾·暗通道先验
格林威3 小时前
工业相机图像高速存储(C++版):内存映射文件(MMF)零拷贝方案,附海康相机实战代码!
开发语言·c++·数码相机·计算机视觉·视觉检测·工业相机·海康相机
十八岁牛爷爷3 小时前
初识相机标定的意义
数码相机·目标检测·机器学习·计算机视觉
我材不敲代码3 小时前
计算机视觉基础——opencv的基础操作
人工智能·opencv·计算机视觉
智驱力人工智能4 小时前
智慧物流中心为何需要包装缺陷检测 商品包装检测 包装标签合规检测 物流包装AI视觉检测系统 电商包装自动化检测 快递封箱完整性AI识别
人工智能·opencv·目标检测·计算机视觉·视觉检测·边缘计算
Daydream.V6 小时前
Opencv——图片处理(二)
人工智能·opencv·计算机视觉
格林威11 小时前
工业相机图像高速存储(C#版):内存映射文件方法,附堡盟相机C#实战代码!
开发语言·人工智能·数码相机·计算机视觉·c#·工业相机·堡盟相机
格林威12 小时前
工业相机图像高速存储(C#版):先存内存,后批量转存方法,附堡盟 (Baumer) 相机实战代码!
开发语言·人工智能·数码相机·opencv·计算机视觉·c#·halcon