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

 

posted @   Liang-ml  阅读(267)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示