C++编写操作OpenCV常用操作
- 环境配置
- 读取图像
- 读取视频
- 调用摄像头
- 调整图像尺寸与裁剪
- 灰度、高斯滤波、边缘检测与膨胀腐蚀
- 绘制形状和文本
- 翘曲景观(鸟俯图)
- 颜色检测
环境配置
首先下载:Visual Studio与功能包OpenCV
其次进行配置
- 环境配置
- 路径配置
找到:项目——属性
注意:链接器的附加依赖项根据opencv版本的不同而不同,我的手opencv4.6.0
读取图像
// 功能:调用路径图片
// 头文件
#include <opencv2/imgcodecs.hpp> // 映像
#include <opencv2/highgui.hpp> // gui
#include <opencv2/imgproc.hpp> // 图像处理
#include <iostream> // 输入输出
// 预编译
using namespace cv;
using namespace std; 读取图像
void main()
{string path = "E:/ProjectOpencv/Project1/test.png"; // 设置路径Mat img = imread(path); // 读取图片imshow("Image", img); // 展示窗口waitKey(0); // 延迟}
读取视频
// 功能:调用路径图片
// 头文件
#include <opencv2/imgcodecs.hpp> // 映像
#include <opencv2/highgui.hpp> // gui
#include <opencv2/imgproc.hpp> // 图像处理
#include <iostream> // 输入输出
// 预编译
using namespace cv;
using namespace std; 读取视频
void main()
{string path = "E:/ProjectOpencv/Project1/test_video.mp4"; // 设置路径VideoCapture cap(path); // 视频流Mat img; // 数学图像while (true) {cap.read(img); // 读取对应数学图像imshow("Image", img); // 展示窗口waitKey(10); // 延迟}
}
调用摄像头
// 功能:调用路径图片
// 头文件
#include <opencv2/imgcodecs.hpp> // 映像
#include <opencv2/highgui.hpp> // gui
#include <opencv2/imgproc.hpp> // 图像处理
#include <iostream> // 输入输出
// 预编译
using namespace cv;
using namespace std;
调用摄像头
void main()
{VideoCapture cap(0); // 视频流Mat img; // 数学图像while (true) {cap.read(img); // 读取对应数学图像imshow("Image", img); // 展示窗口waitKey(1); // 延迟}
}
调整图像尺寸与裁剪
// 头文件
#include <opencv2/imgcodecs.hpp> // 映像
#include <opencv2/highgui.hpp> // gui
#include <opencv2/imgproc.hpp> // 图像处理
#include <iostream> // 输入输出
// 预编译
using namespace cv;
using namespace std; 读取图像
void main()
{string path = "E:/ProjectOpencv/Project1/test.png"; // 设置路径Mat img = imread(path); // 读取图片 Mat imgResize, imgCrop; // 声明变量//cout << img.size() << endl; // 打印图像大小resize(img, imgResize, Size(), 0.5, 0.5); // 调整图像尺寸(此为等比调整,若想自己调整只需要再Size里输入尺寸即可)Rect roi(200, 100, 300, 300); // 裁剪标准(作标x和y,裁剪的宽度和高度)imgCrop = img(roi); // 裁剪图片imshow("Image", img);imshow("Image Resize", imgResize);imshow("Image Crop", imgCrop);waitKey(0);
}
灰度、高斯滤波、边缘检测与膨胀腐蚀
// 头文件
#include <opencv2/imgcodecs.hpp> // 映像
#include <opencv2/highgui.hpp> // gui
#include <opencv2/imgproc.hpp> // 图像处理
#include <iostream> // 输入输出
// 预编译
using namespace cv;
using namespace std; 读取图像
void main()
{string path = "E:/ProjectOpencv/Project1/test.png"; // 设置路径Mat img = imread(path); // 读取图片 Mat imgGray, imgBlur, imgCanny, imgDil, imgErode; // 声明变量cvtColor(img, imgGray, COLOR_BGR2GRAY); // 转化图像(输入对象,输出对象,颜色操作)GaussianBlur(imgGray, imgBlur, Size(7, 7), 5, 0); // 高斯滤波(输入对象,输出对象,内核大小,sigma x,sigma y)Canny(imgBlur, imgCanny, 25, 75); // Canny边缘检测器(输入对象,输出对象,两个阈值)Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); // 编写内核(3x3的矩阵)dilate(imgCanny, imgDil, kernel); // 图像膨胀erode(imgDil, imgErode, kernel); // 图像侵蚀// 展示图片imshow("Image", img);imshow("Image Gray", imgGray);imshow("Image Blur", imgBlur);imshow("Image Canny", imgCanny);imshow("Image Dilation", imgDil);imshow("Image Erode", imgErode);waitKey(0);
}
绘制形状和文本
// 头文件
#include <opencv2/imgcodecs.hpp> // 映像
#include <opencv2/highgui.hpp> // gui
#include <opencv2/imgproc.hpp> // 图像处理
#include <iostream> // 输入输出
// 预编译
using namespace cv;
using namespace std; 绘制形状和文字
void main() {// 黑色图像Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255)); // 绘制画布circle(img, Point(256, 256), 155, Scalar(0, 69, 255), FILLED); // 绘制圆(参数:画布对象,圆心位置,半径,颜色,线条粗细)rectangle(img, Point(130, 226), Point(382, 286), Scalar(255, 255, 255), FILLED); // 绘制矩形(参数:画布对象,左上角位置,右下角位置,颜色,线条粗细)line(img, Point(130, 296), Point(382, 296), Scalar(255, 255, 255), 2); // 绘制线(参数:画布对象,起始点,终点,颜色,线条粗细)putText(img, "Wo bleibt Mozart", Point(137, 262), FONT_HERSHEY_DUPLEX, 0.75, Scalar(0, 69, 255), 2); // 绘制文字(参数:画布对象,文字内容,起始位置,字体类型,字体大小,颜色,线条粗细)imshow("Image", img);waitKey(0);
}
翘曲景观(鸟俯图)
// 头文件
#include <opencv2/imgcodecs.hpp> // 映像
#include <opencv2/highgui.hpp> // gui
#include <opencv2/imgproc.hpp> // 图像处理
#include <iostream> // 输入输出
// 预编译
using namespace cv;
using namespace std;/// 翘曲景观(鸟俯图) //void main() {string path = "E:/ProjectOpencv/Project1/cards.jpg"; // 文件路径Mat img = imread(path); //读取文件Mat matrix, imgWarp; // 预定义float w = 250, h = 350; // 定义使用高宽Point2f src[4] = { {529,142},{771,190},{405,395},{674,457} }; // 图片的四个坐标称为矩阵要点(我们可以通过图片编辑软件获得)(数组)Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} }; // 定义新的显示图像大小(数组)// 使用转换矩阵进行处理(线性变换矩阵)matrix = getPerspectiveTransform(src, dst); // 仿射变换(matrix是变换关系矩阵)warpPerspective(img, imgWarp, matrix, Point(w, h)); // // 显示四个点for (int i = 0; i < 4; i++){circle(img, src[i], 10, Scalar(0, 0, 255), FILLED);}// 显示图片imshow("Image", img);imshow("Image Warp", imgWarp);waitKey(0);}
颜色检测
// 头文件
#include <opencv2/imgcodecs.hpp> // 映像
#include <opencv2/highgui.hpp> // gui
#include <opencv2/imgproc.hpp> // 图像处理
#include <iostream> // 输入输出
// 预编译
using namespace cv;
using namespace std;/// 颜色检测 //void main() {string path = "E:/ProjectOpencv/Project1/lambo.png"; // 文件路径Mat img = imread(path); //读取文件Mat imgHSV, mask; // 预定义// 设置我们所要选的颜色界限int hmin = 0, smin = 110, vmin = 153;int hmax = 19, smax = 240, vmax = 255;cvtColor(img, imgHSV, COLOR_BGR2HSV); // BGR颜色空间转化为HSV(输入对象,输出对象,颜色操作)// 创建一个窗口做参数调整namedWindow("Trackbars", (640, 200));createTrackbar("Hue Min", "Trackbars", &hmin, 179); // H通道色调(进度条名,显示窗口,值地址,最大值)createTrackbar("Hue Max", "Trackbars", &hmax, 179); createTrackbar("Sat Min", "Trackbars", &smin, 255); // S通道饱和度(进度条名,显示窗口,值地址,最大值)createTrackbar("Sat Max", "Trackbars", &smax, 255);createTrackbar("Val Min", "Trackbars", &vmin, 255); // V通道明度(进度条名,显示窗口,值地址,最大值)createTrackbar("Val Max", "Trackbars", &vmax, 255);while (true) {// 设置hsv的界限Scalar lower(hmin, smin, vmin);Scalar upper(hmax, smax, vmax);inRange(imgHSV, lower, upper, mask); // 设置上下限值,mask为输出图像// 显示图片imshow("Image", img);imshow("Image HSV", imgHSV);imshow("Image Mask", mask);waitKey(1);}
}