OpenCV开发环境(Windows系统)
VisualStudio2022 配置 OpenCV4.8.0 示例
VC++目录 -> 包含目录 -> E:\VariousTools\opencv\build\include
VC++目录 -> 库目录 -> E:\VariousTools\opencv\build\x64\vc16\lib
链接器 -> 输入 -> 附加依赖项 -> opencv_world480.lib(Release|x64) or opencv_world480d.lib(Debug|x64)
CMkae 配置 OpenCV4.5.5(mingw) 示例(Windows11系统)
# CMakeLists.txt文件
cmake_minimum_required(VERSION 3.10)
project(opencv_demo)
set(OpenCV_DIR E:/VariousTools/OpenCV-MinGW-Build-OpenCV-4.5.5-x64/x64/mingw/lib)
# 查找OpenCV库
find_package(OpenCV REQUIRED)
if (OpenCV_FOUND)
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
else()
message(FATAL_ERROR "Could not find OpenCV library")
endif()
# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})
# 指定动态链接库位置
link_directories(${OpenCV_LIBS})
add_executable(demo1 src/demo1.cpp)
# 链接OpenCV库
target_link_libraries(demo1 PRIVATE ${OpenCV_LIBS})
注:set(OpenCV_DIR E:/VariousTools/opencv/build/x64/vc16/lib)时输出可以正常找到OpenCV4.8.0和相关依赖库,但在cmake构建时会报错:undefined reference to `cv::imread … 等,推测可能原因是该路径与VisualStudio的编辑器(msvc)是对应的,而CMake构建项目时用的是cmake -G “MinGW Makefiles” -B build -> cmake --build build,即mingw开发工具,因此需要对应mingw版本的opencv,可自行编译,亦可在github上获取。若可执行程序成功生成但无法定位程序输入点于…dll文件中,则调整环境变量中mingw的位置即可。
Qt的qmake 配置 OpenCV4.5.5(mingw) 示例
INCLUDEPATH += E:\VariousTools\OpenCV-MinGW-Build-OpenCV-4.5.5-x64\include
LIBS += E:\VariousTools\OpenCV-MinGW-Build-OpenCV-4.5.5-x64\x64\mingw\bin\libopencv_*.dll
OpenCV示例程序
// camera.cpp
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 视频采集对象
VideoCapture cap;
// 设置分辨率
int width = 640;
int height = 480;
// 设置摄像头的宽和高
cap.set(CAP_PROP_FRAME_WIDTH, width);
cap.set(CAP_PROP_FRAME_HEIGHT, height);
// 打开摄像头
cap.open(0);
if (!cap.isOpened())
{
cout << "无法打开摄像头..." << endl;
return 1;
}
// Mat类型的frame读取返回的帧
Mat frame;
// 写入.mp4文件,参数依次为:文件名,编码格式,帧率,帧大小
// VideoWriter writer("./output/record.mp4", VideoWriter::fourcc('H', '2', '6', '4'), 20, Size(width, height));
// 循环读取视频帧
while (true)
{
// 读取视频帧 -> read()函数
cap.read(frame);
flip(frame, frame, 1);
// 显示视频帧
cv::imshow("opencv_demo", frame);
// 写入视频
// writer.write(frame);
// 等待按键,延时30ms,否则视频播放太快
int k = waitKey(30);
if (k == 27)
{
cout << "退出..." << endl;
break;
}
}
return 0;
}
// imgAction.cpp
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
int main(int argc, char** argv)
{
// 读取图像
cv::Mat img = cv::imread("./media/sea.jpg");
cv::Mat img_resize;
// 调整size -> 输入图像、输出图像、输出图像大小
cv::resize(img, img_resize, cv::Size(320, 240));
cv::Mat img_copy;
// 拷贝图像
img_resize.copyTo(img_copy);
cv::Rect rect(100, 100, 200, 100); // x, y, width, height
// 裁剪图像
cv::Mat img_roi = img(rect);
cv::imwrite("./output/img_roi.jpg", img_roi);
// 水平拼接图像 -> 保证两张图片高度(rows)一致
cv::Mat img_hcon;
cv::hconcat(img_resize, img_copy, img_hcon);
cv::imwrite("./output/img_hcon.jpg", img_hcon);
// 垂直拼接图像 -> 保证两张图片宽度(cols)一致
cv::Mat img_vcon;
cv::vconcat(img_resize, img_copy, img_vcon);
cv::imwrite("./output/img_vcon.jpg", img_vcon);
// 翻转图片
cv::Mat flip;
cv::flip(img_resize, flip, 1); // 1 -> 水平翻转;0 -> 竖直翻转;-1 -> 水平垂直翻转
cv::imwrite("./output/img_flip.jpg", flip);
// 旋转图片
cv::Mat rotate;
cv::rotate(img_resize, rotate, cv::ROTATE_90_CLOCKWISE); // 顺时针旋转90度
cv::imwrite("./output/img_rotate.jpg", rotate);
return 0;
}
// readImg.cpp
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
int main(int argc, char** argv)
{
// 读取图片,返回 -> Mat格式
cv::Mat img = cv::imread("./media/montains.jpg");
// 判断是否读取成功
if (img.empty())
{
cout << "Could not read the image." << endl;
return 1;
}
// 打印图片的高度和宽度信息
cout << "height: " << img.rows << ", " << "width: " << img.cols << endl;
// 打印图片data
// cout << "data: " << cv::format(img, cv::Formatter::FMT_NUMPY) << endl; // numpy格式
// cout << "data: " << cv::format(img, cv::Formatter::FMT_PYTHON) << endl; // list格式
// 创建灰度图
cv::Mat gray;
// 灰度转换
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY),
// 保存图片
cv::imwrite("./output/gray.jpg", gray);
// 显示图片
cv::imshow("灰度化的图片", gray);
// 等待按键
cv::waitKey(0);
return 0;
}