OpenCV4学习(1-13)
目录1.环境安装2.示例程序3.认识Mat容器单通道矩阵1. 核心判断依据2. 完整维度信息3. 对比多通道写法区分双通道示例Vec2i2 通道 int三通道示例Vec3b3 通道 uchar4. 补充知识点4.Mat类元素的读取5.Mat支持的运算6.图像加载与显示imread()nameWindow()imshow()imwrite()7.Image watch 使用8.视频加载摄像头使用VideoCapture()get()VideoWriter()9.图像颜色空间变换converTo()cvtColor()10.多通道分离与合并split()merge()11.两张图像像素比较min()max()minMaxLoc()12.图像像素逻辑操作bitwise_not()bitwise_and()bitwise_or()bitwise_xor()13.图像二值化threshold()adaptiveThreshold()1.环境安装参考之前博客2.示例程序路径如下每个代码是单独的main程序可以新建工程调用。注意有的执行需要带参数有的不需要看源码。exampleedge.cpp边缘检测kmeans.cpp•K聚类camshiftdemo.cpp 跟踪。。。3.认识Mat容器#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { system(color F0); // 3行3列 单通道8位无符号矩阵未初始化随机值 Mat a(3, 3, CV_8UC1); // Size(宽,高) 4列4行 单通道矩阵 Mat b(Size(4, 4), CV_8UC1); // 5行5列 双通道统一填充 Scalar(4,5)第三个参数6丢弃 Mat c0(5, 5, CV_8UC2, Scalar(4, 5, 6)); Mat c1(5, 5, CV_8UC2, Scalar(4, 5, 6)); Mat c2(5, 5, CV_8UC2, Scalar(4, 5, 6)); // 1行5列 int 单行向量 Mat d (cv::Mat_int(1, 5) 1, 2, 3, 4, 5); // 以d为对角线生成5阶对角方阵 Mat e Mat::diag(d); // 截取e行2~3列2~3左闭右开Range(2,4) Mat f Mat(e, Range(2, 4), Range(2, 4)); cout c0 endl; cout c0 endl; cout c1 endl; cout c1 endl; cout c2 endl; cout c2 endl; cout d endl; cout d endl; cout e endl; cout e endl; cout f endl; cout f endl; return 0; }单通道矩阵1. 核心判断依据cpp运行Mat a (cv::Mat_int(3, 3) 1, 2, 3, 4, 5, 6, 7, 8, 9);cv::Mat_int代表单通道整型矩阵模板参数只有一个类型int对应通道数C1每个像素仅存储 1 个 int 数值不存在多通道分组。2. 完整维度信息尺寸3 行 × 3 列通道数1数据类型32 位整型对应CV_32SC1矩阵内容plaintext[1, 2, 3; 4, 5, 6; 7, 8, 9]3. 对比多通道写法区分双通道示例Vec2i2 通道 intcpp运行Mat twoCh (Mat_Vec2i(2,2) Vec2i(1,2), Vec2i(3,4), Vec2i(5,6), Vec2i(7,8));三通道示例Vec3b3 通道 ucharcpp运行Mat threeCh (Mat_Vec3b(2,2) Vec3b(1,2,3), Vec3b(4,5,6), Vec3b(7,8,9), Vec3b(10,11,12));4. 补充知识点Mat_TT 为普通基础类型uchar/int/float→单通道T 为Vec2b/Vec3i/Vec4f向量类型 →多通道等价普通构造写法cpp运行Mat a(3,3, CV_32SC1); // CV_32SC1 32bit int, single channel4.Mat类元素的读取#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { system(color F0); // 3行3列int矩阵流式赋值 Mat a (cv::Mat_int(3, 3) 1, 2, 3, 4, 5, 6, 7, 8, 9); // 单通道 8UC1Scalar仅取第一个值4 Mat c0(5, 5, CV_8UC1, Scalar(4, 5, 6)); // 双通道 8UC2Scalar取前两个值4、5 Mat c1(5, 5, CV_8UC2, Scalar(4, 5, 6)); // 三通道 8UC3Scalar取全部三个值4、5、6 Mat c2(5, 5, CV_8UC3, Scalar(4, 5, 6)); cout a endl; // 读取矩阵a第0行第0列int像素 cout a.atint(0, 0) endl; cout c1 endl; // 读取c1双通道像素(0行1列)存入Vec2b向量 Vec2b vc c1.atVec2b(0, 1); cout vc endl; // 打印通道0数值 cout (int)vc[0] endl; cout c2 endl; // 原始截图后半段截断完整寻址写法取c2第2行第3列像素第0通道 cout (double)(*(c2.data c2.step[0] * 2 c2.step[1] * 2 3)) endl; // 打印Vec2b第二通道 cout (int)vc[1] endl; cout 注意vc[1] 注意 endl; return 0; }5.Mat支持的运算OpenCV: OpenCV modules#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { system(color F0); Mat a (cv::Mat_int(3, 3) 1, 2, 3, 4, 5, 6, 7, 8, 9); Mat b (cv::Mat_int(3, 3) 1, 2, 3, 7, 8, 9, 4, 5, 6); Mat c (cv::Mat_double(3, 3) 1.0, 2.1, 3.2, 4.0, 5.1, 6.2, 2, 2, 2); Mat d (cv::Mat_double(3, 3) 1.0, 2.1, 3.2, 4.0, 5.1, 6.2, 2, 2, 2); cout 两个矩阵的和 endl a b endl; cout 两个矩阵的差 endl c - d endl; cout 矩阵数乘 endl 2 * a endl; cout 矩阵数除 endl d / 2.0 endl; cout 矩阵减数 endl a - 1 endl; cout 两矩阵相乘 endl c*d endl; cout 矩阵内积 endl a.dot(b) endl; cout 矩阵对应位相乘 endl a.mul(b) endl; cout 两个矩阵最小值 endl min(a, b) endl; return 0; }6.图像加载与显示imread()nameWindow()imshow()imwrite()#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { Mat img; img imread(C:/opencv/lena.png,IMREAD_COLOR); Mat gray imread(C:/opencv/lena.png, IMREAD_GRAYSCALE); namedWindow(img, WINDOW_AUTOSIZE); namedWindow(gray, WINDOW_NORMAL); imshow(img, img); imshow(gray, gray); //vectorint compression_params; //compression_params.push_back(IMWRITE_PNG_COMPRESSION); //compression_params.push_back(9); imwrite(C:/opencv/newlena.jpg, img); waitKey(0); return 0; }7.Image watch 使用8.视频加载摄像头使用VideoCapture()get()VideoWriter()#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { /*VideoCapture video; video.open(1); if (!video.isOpened()) { cout 请检查视频文件 endl; return -1; } cout 视频帧率 video.get(CAP_PROP_FPS) endl; cout 视频宽度 video.get(CAP_PROP_FRAME_WIDTH) endl; while (1) { Mat frame; video frame; if (frame.empty()) { break; } imshow(video, frame); uchar c waitKey(1000 / video.get(CAP_PROP_FPS)); if (cq) { break; } }*/ Mat img; VideoCapture video; //使用某个摄像头 video.open(C:/opencv/55.mp4); //VideoCapture video(1); //使用某个摄像头 //读取视频 //VideoCapture video; //video.open(cup.mp4); if (!video.isOpened()) // 判断是否调用成功 { cout 打开摄像头失败请确实摄像头是否安装成功; return -1; } video img; //获取图像 //检测是否成功获取图像 if (img.empty()) //判断有没有读取图像成功 { cout 没有获取到图像 endl; return -1; } bool isColor (img.type() CV_8UC3); //判断相机视频类型是否为彩色 VideoWriter writer; int codec VideoWriter::fourcc(M, J, P, G); // 选择编码格式 double fps 25.0; //设置视频帧率 string filename live.avi; //保存的视频文件名称 writer.open(filename, codec, fps, img.size(), isColor); //创建保存视频文件的视频流 if (!writer.isOpened()) //判断视频流是否创建成功 { cout 打开视频文件失败请确实是否为合法输入 endl; return -1; } while (1) { //检测是否执行完毕 if (!video.read(img)) //判断能都继续从摄像头或者视频文件中读出一帧图像 { cout 摄像头断开连接或者视频读取完成 endl; break; } writer.write(img); //把图像写入视频流 //writer img; imshow(Live, img); //显示图像 char c waitKey(50); if (c 27) //按ESC案件退出视频保存 { break; } } // 退出程序时刻自动关闭视频流 //video.release(); //writer.release(); return 0; }9.图像颜色空间变换converTo()cvtColor()#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { // 读取图片默认BGR三通道CV_8UC3 Mat img imread(C:/opencv/lena.png); Mat img32; // 8UC3 → 32位浮点像素值归一化到 [0, 1] img.convertTo(img32, CV_32F, 1 / 255.0, 0); Mat HSV, HSV32; // 原图8位BGR转HSV cvtColor(img, HSV, COLOR_BGR2HSV); // 浮点归一化BGR转HSV cvtColor(img32, HSV32, COLOR_BGR2HSV); Mat gray0, gray1; // BGR图转灰度正确 cvtColor(img, gray0, COLOR_BGR2GRAY); // 错误img是BGR存储不能用RGB2GRAY灰度结果会失真 cvtColor(img, gray1, COLOR_RGB2GRAY); return 0; }10.多通道分离与合并split()merge()#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { Mat img imread(C:/opencv/lena.png); Mat img32; img.convertTo(img32, CV_32F, 1 / 255.0, 0); Mat gray0, gray1; cvtColor(img, gray0, COLOR_BGR2GRAY); cvtColor(img, gray1, COLOR_RGB2GRAY); Mat imgs[3]; split(img, imgs); Mat img0, img1, img2; img0 imgs[0]; img1 imgs[1]; img2 imgs[2]; Mat img_H; merge(imgs, 3, img_H); Mat zero Mat::zeros(Size(img.cols, img.rows), CV_8UC1); vectorMat imgsV; imgsV.push_back(img0); imgsV.push_back(zero); imgsV.push_back(zero); /*imgsV.push_back(zero); imgsV.push_back(zero); imgsV.push_back(img2);*/ Mat imgsVH; merge(imgsV, imgsVH); return 0; }11.两张图像像素比较min()max()minMaxLoc()#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { Mat img imread(C:/opencv/learnOpenCV/lena.png); Mat white imread(C:/opencv/learnOpenCV/mark_white.png); Mat black imread(C:/opencv/learnOpenCV/mark_black.png); Mat Min, Max; min(img, white, Min); max(img, black, Max); Mat gray, gray_white; cvtColor(img, gray, COLOR_BGR2GRAY); cvtColor(white, gray_white, COLOR_BGR2GRAY); double minVal, maxVal; Point minLoc, maxLoc; minMaxLoc(gray, minVal, maxVal, minLoc, maxLoc, gray_white); return 0; }12.图像像素逻辑操作bitwise_not()bitwise_and()bitwise_or()bitwise_xor()#include opencv2/opencv.hpp #include iostream using namespace cv; using namespace std; int main() { Mat a (Mat_uchar(1, 2) 0, 5); Mat b (Mat_uchar(1, 2) 0, 6); Mat Xor, Or, Not, And; bitwise_not(a, Not); cout a Not Not endl; bitwise_and(a, b, And); bitwise_or(a, b, Or); bitwise_xor(a, b, Xor); cout And endl; cout Or endl; cout Xor endl; Mat img imread(C:/opencv/learnOpenCV/lena.png); Mat mark imread(C:/opencv/learnOpenCV/mark_white.png); Mat result; bitwise_and(img, mark, result); Mat img_inv; //bitwise_not(img, img_inv); cvtColor(mark, mark, COLOR_BGR2GRAY); bitwise_not(img, img_inv, mark); Mat mark_black imread(C:/opencv/learnOpenCV/mark_black.png); min(img, mark_black, img); img img img_inv; return 0; }13.图像二值化threshold()adaptiveThreshold()#include opencv2\opencv.hpp #include iostream using namespace std; using namespace cv; int main() { Mat img imread(C:/opencv/learnOpenCV/lena.png); if (img.empty()) { cout 请确认图像文件名称是否正确 endl; return -1; } Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); Mat img_B, img_B_V, gray_B, gray_B_V, gray_T, gray_T_V, gray_TRUNC; //彩色图像二值化 threshold(img, img_B, 125, 255, THRESH_BINARY); threshold(img, img_B_V, 125, 255, THRESH_BINARY_INV); imshow(img_B, img_B); imshow(img_B_V, img_B_V); //灰度图BINARY二值化 threshold(gray, gray_B, 125, 255, THRESH_BINARY); threshold(gray, gray_B_V, 125, 255, THRESH_BINARY_INV); imshow(gray_B, gray_B); imshow(gray_B_V, gray_B_V); //灰度图像TOZERO变换 threshold(gray, gray_T, 125, 255, THRESH_TOZERO); threshold(gray, gray_T_V, 125, 255, THRESH_TOZERO_INV); imshow(gray_T, gray_T); imshow(gray_T_V, gray_T_V); //灰度图像TRUNC变换 threshold(gray, gray_TRUNC, 125, 255, THRESH_TRUNC); imshow(gray_TRUNC, gray_TRUNC); //灰度图像大津法和三角形法二值化 Mat img_Thr imread(C:/opencv/learnOpenCV/threshold.png, IMREAD_GRAYSCALE); Mat img_Thr_O, img_Thr_T; threshold(img_Thr, img_Thr_O, 100, 255, THRESH_BINARY | THRESH_OTSU); threshold(img_Thr, img_Thr_T, 125, 255, THRESH_BINARY | THRESH_TRIANGLE); imshow(img_Thr, img_Thr); imshow(img_Thr_O, img_Thr_O); imshow(img_Thr_T, img_Thr_T); Mat adaptive_mean, adaptive_gauss; adaptiveThreshold(img_Thr, adaptive_mean, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 55, 0); adaptiveThreshold(img_Thr, adaptive_gauss, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 55, 0); imshow(adaptive_mean, adaptive_mean); imshow(adaptive_gauss, adaptive_gauss); waitKey(0); return 0; }

相关新闻

革命性AI空气动力学工具XMeshGraphNet DrivAerML:NVIDIA如何用图神经网络加速汽车设计

革命性AI空气动力学工具XMeshGraphNet DrivAerML:NVIDIA如何用图神经网络加速汽车设计

革命性AI空气动力学工具XMeshGraphNet DrivAerML:NVIDIA如何用图神经网络加速汽车设计 【免费下载链接】xmgn_drivaerml_surface 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/xmgn_drivaerml_surface XMeshGraphNet-DrivAerML是一款由NVIDIA开发的…

2026/7/13 15:48:18 阅读更多 →
为什么92%的提示词工程师仍在用非结构化写法?——ChatGPT结构化提示词的5层嵌套模型与实时效果对比数据

为什么92%的提示词工程师仍在用非结构化写法?——ChatGPT结构化提示词的5层嵌套模型与实时效果对比数据

更多请点击: https://codechina.net 第一章:为什么92%的提示词工程师仍在用非结构化写法? 当提示工程从实验性实践演变为专业岗位,一个反直觉的现象持续存在:绝大多数从业者仍依赖自由文本式提示——即无字段约束、无…

2026/7/13 15:48:18 阅读更多 →
Gammazero/Deque社区贡献指南:如何参与这个高性能队列项目的开发

Gammazero/Deque社区贡献指南:如何参与这个高性能队列项目的开发

Gammazero/Deque社区贡献指南:如何参与这个高性能队列项目的开发 【免费下载链接】deque Fast ring-buffer deque (double-ended queue) 项目地址: https://gitcode.com/gh_mirrors/deque3/deque Gammazero/Deque是一个高性能的环形缓冲区双端队列实现&#…

2026/7/13 15:46:17 阅读更多 →

最新新闻

Iframe 全屏自适应: 从基础CSS到跨域动态高度的完整解决方案

Iframe 全屏自适应: 从基础CSS到跨域动态高度的完整解决方案

1. 基础CSS实现静态全屏布局要让iframe铺满整个屏幕,最基础的方法是使用CSS的定位和百分比布局。我们先从最简单的场景开始:当iframe嵌入的页面高度固定,且不需要动态调整时。假设我们有一个Vue组件需要嵌入第三方页面,基础HTML结…

2026/7/13 16:43:17 阅读更多 →
钓鱼渗透测试实验复现

钓鱼渗透测试实验复现

钓鱼渗透测试实验复现用途:网络安全学习分享,仅限授权环境测试一、实验环境角色系统/工具IP地址攻击机Windows 11(矛盾武器库)10.0.0.166靶机Windows 10 x6410.0.0.153攻击机:Windows 11 Penetration Suite Toolkit - …

2026/7/13 16:41:15 阅读更多 →
清华求真书院预科班有学生未通过考核的处理结果

清华求真书院预科班有学生未通过考核的处理结果

关于清华大学求真书院 2026 级预科班少数学生未通过考核一事,目前公开信息主要聚焦于院方的回应与后续改革方向,‌尚未公布具体的“清退”名单或详细的行政处理文件‌。 根据清华大学求真书院院长丘成桐的回应,针对该事件的处理与后续安排主要…

2026/7/13 16:39:14 阅读更多 →
离散数学符号表 50+ 核心符号速查:从集合论到命题逻辑的完整释义

离散数学符号表 50+ 核心符号速查:从集合论到命题逻辑的完整释义

离散数学核心符号全解:从集合论到命题逻辑的实战指南离散数学作为计算机科学的基石,其符号系统就像程序员的第二语言。第一次接触这些符号时,我完全被各种∧、∨、⊕搞得晕头转向——直到在算法课上因为误解了一个符号含义导致整个程序逻辑出…

2026/7/13 16:39:14 阅读更多 →
智能语音修复神器:VoiceFixer让受损音频重获新生

智能语音修复神器:VoiceFixer让受损音频重获新生

智能语音修复神器:VoiceFixer让受损音频重获新生 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 在数字音频处理领域,语音修复技术正经历着革命性的变革。无论是历史录音的数字…

2026/7/13 16:39:14 阅读更多 →
Unity生存射击游戏开发:从AlienShooter项目掌握核心架构与优化

Unity生存射击游戏开发:从AlienShooter项目掌握核心架构与优化

1. 项目概述:为什么选择从AlienShooter开始你的Unity生存游戏之旅?如果你正在寻找一个能串联起Unity核心开发技能,又能做出一个完整、可玩、有成就感的项目,那么一个生存射击游戏(Survival Shooter)绝对是黄…

2026/7/13 16:37:11 阅读更多 →

日新闻

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:01:19 阅读更多 →
浦东旧模块回收哪家强?专业评测带你一探究竟

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

2026/7/13 0:01:19 阅读更多 →
卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

2026/7/13 0:05:20 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/13 4:38:36 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/13 4:38:38 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/13 4:38:40 阅读更多 →

月新闻