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
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()