C++ openCV 相关
一、 opencv的Mat矩阵
Mat是opencv在C++中的一个图像容器类,可以使用Mat进行图像矩阵的定义
Vec3b对应的三通道顺序是BGR的uchar数据类型
Vec3f对应的三通道顺序是BGR的float数据类型
数据类型的转化使用src.convertTo(dst, type)
Mat矩阵的定义
#include<iostream> #include<opencv2/opencv.hpp> // 定义图像矩阵 cv::Mat image(cv::Size(row, col), CV_8UC1) // 单通道图像,存放uchar cv::Mat image = cv::Mat(cv::Size(row, col), CV_8UC3) // 三通道图像,存放Vec3b类型 // 特殊矩阵定义 cv::Mat zeros = cv::Mat::zeros(cv::Size(row, col), CV_8UC1) // 全0 cv::Mat zeros = cv::Mat::zeros(h,w,CV_8UC1) cv::Mat ones = cv::Mat::ones(cv::Size(row, col), CV_8UC1) // 全1 cv::Mat ones = cv::Mat::ones(h,w,CV_8UC1) cv::Mat eyes = cv::Mat::eyes(cv::Size(row, col), CV_32FC1) // 对角线全1 cv::Mat eyes = cv::Mat::eyes(h,w,CV_32FC1)
opencv中的坐标系左上角为(0, 0),向右下方向,Mat矩阵是按照(row, col)进行排布的,即(y, x)
单通道灰度图数据存放格式
多通道图像的数据存放格式
opencv中三通道图像的存储是以二维矩阵的形式实现的,即rows * (channel * cols)
Mat矩阵的访问
Mat矩阵不能像python中直接用 [ ]进行访问,有多种访问方式,这里使用at进行访问,先y后x(先行后列)
// 单通道图像的访问 uchar pixel = image.at<uchar>(row, col); // 单通道图像是以uchar形式存储的,输入需要int(pixel) uchar pixel = image.at<uchar>(Point(x, y)); // 三通道图像的访问 Vec3b pixels = image.at<Vec3b>(row, col); // 三通道图像是以Vec3b形式存储的 Vec3b bp = image.at<Vec3b>(row, col)[0]; // 蓝色通道
Vec3b gp = image.at<Vec3b>(row, col)[1]; // 绿色通道
Vec3b rp = image.at<Vec3b>(row, col)[2]; // 红色通道
Mat的拷贝使用 image.clone()
Scalar()用于描述颜色,一般出现在函数的参数里,本身有4个参数,用几个写几个就行,比如Scalar(b,g,r) Scalar(200)
二、获取图像的ROI
声明矩形框用cv::Rect
cv::Mat image = cv::imread(image_path);
cv::Mat roi = image(cv::Rect(x1,y1,x2,y2));
三、 相关函数
主要是一些变量的定义,其他和python上都一样
1. 捕获视频对象
cv::VideoCapture cap(0); // 开启默认摄像头,被cap获取 cv::VideoCapture cao(video_path); // 打开视频,被cap获取 Mat img; while(true){ cap.read(img); cv::imshow("img",img); cv::waitkey(1); }
2. 颜色空间转换
void cv::cvtColor(Mat input, Mat output, int code)
3. 各种滤波
Mat image, imgBlur, imgGau, imgMedian; cv::Blur(image, imgBlur, Size(3,3)); cv::MedianBlur(image, imgMedian, 3); cv::GaussianBlur(image, imgGau, Size(3,3), 3, 0);
4. Canny边缘检测
cv::Canny(Mat input, Mat output, double minval, double maxval)
5. 形态学操作
cv::Mat kernel = cv::getStruucturingElement(type, Size());
cv::dilate(Mat input, Mat output, Mat kernel);
cv::erode(Mat input, Mat output, Mat kernel);
6. 尺寸缩放和裁剪
cv::resize(Mat input, Mat output, Size, double fx, double fy)
cv::Rect roi = cv::Rect(100,100,200,200); roi = image(roi)
7. 二值化
double threshold(Mat input, Mat output, double thresh, double maxval, int type);
void cv::findContours(Mat input, vector<vector<Point>> contours, vector<Vec4i>, int type, int type);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!