OpenCV【未完结】

1_图片读取与显示

imread()函数:读取图片
param1:图片的名称
如果当前读入的图片与该脚本在相同目录下,则路径可以为相对路径
如果当前读入的图片不与该脚本在相同目录下,则路径可以为绝对路径
param2:常见的为以下三种
IMREAD_UNCHANGED = -1, 按原样返回加载的图像(使用alpha通道,否则会被裁剪)。忽略EXIF方向。
IMREAD_GRAYSCALE = 0, 始终将图像转换为单通道灰度图像(编解码器内部转换)。
IMREAD_COLOR = 1, 始终将图像转换为3通道BGR彩色图像。
namewindow()函数:打开桌面窗口
param2:
WINDOW_NORMAL 用户可以调整窗口大小(无限制)/也可以将全屏窗口切换到正常大小。
WINDOW_AUTOSIZE 用户无法调整窗口大小,窗口大小受显示图像的限制。
imshow():图片显示
parm1:所要显示的窗口,若不存在便创建一个新的窗口
parm2:所要显示的照片
waitKey(0):将显示窗口停留,不会一闪而过显示图像
输入图片:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int artc, char** argv) {Mat src = imread("./test.png", IMREAD_GRAYSCALE);if (src.empty()) {cput<<"could not load image..."<<endl;return -1;}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src);waitKey(0);return 0;
}

输出图片:

2_图片灰度化

cvtColor(src, gray, COLOR_BGR2GRAY)
param1:输入图像
param2:输出图像
param3:为转换类型,详细类型请查看源码参数

输入图片:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int artc, char** argv) {Mat src = imread("./test.png");if (src.empty()) {cout<<"could not load image..."<<endl;return -1;}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src);Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);imwrite("./gray.png", gray);waitKey(0);return 0;
}

输入图片:

3_图像创建与赋值

.clone()函数:clone是把所有的都复制过来,不论你是否设置了ROI、COI等影响,clone都会原封不动的克隆过来。会为其分配新内存
.copyTo()函数:copyTo不会为目标矩阵重新分配内存,拷贝src到m2中
param1:矩阵的行
param2:矩阵的列
param3:类型 CV_8UC3表示为8位三通道 U为unsigned
Mat_(2,3)<<0,1,2,4,5,6;

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int artc, char** argv) {Mat src = imread("./test.png");if (src.empty()) {cout<<"could not load image..."<<endl;return -1;}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src);Mat m1 = src.clone();Mat m2;src.copyTo(m2);Mat m3 = src;Mat m4 = Mat::zeros(src.size(), src.type());Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);Mat m6 = Mat::ones(Size(512, 512), CV_8UC3);Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0,-1, 5, -1,0, -1, 0);waitKey(0);return 0;
}

4_图像像素读写

Vec3b:Vec3b可以看作是vector<uchar, 3>,可以理解为一个uchar类型的,长度为3的vector向量
src.rows:图像的行
src.cols:图像的列
src.channels():图像的通道数

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int artc, char** argv) {Mat src = imread("");if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input", WINDOW_AUTOSIZE);imshow("input", src);//获取图像的长、宽、通道int height = src.rows;int width = src.cols;int ch = src.channels();for (int c = 0; c < ch; c++) {for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {if (ch == 3) //若为3通道图像{Vec3b bgr = src.at<Vec3b>(row, col);bgr[0] = 255 - bgr[0];//反转颜色bgr[1] = 255 - bgr[1];bgr[2] = 255 - bgr[2];src.at<Vec3b>(row, col) = bgr;}else if (ch == 1) //若为灰度图{int gray = src.at<uchar>(row, col);src.at<uchar>(row, col) = 255 - gray;//反转颜色}}}}imshow("output", src);//利用指针遍历Mat result = Mat::zeros(src.size(), src.type());int blue = 0, green = 0, red = 0;int gray;for (int c = 0; c < ch; c++) {for (int row = 0; row < height; row++) {uchar* curr_row = src.ptr<uchar>(row);//行指针uchar* result_row = result.ptr<uchar>(row);for (int col = 0; col < width; col++) {if (ch == 3) {blue = *curr_row++;//先++后取值green = *curr_row++;red = *curr_row++;*result_row++ = blue;*result_row++ = green;*result_row++ = red;}else if (ch == 1) {gray = *curr_row++;*result_row++ = gray;}}}}imshow("result", result);waitKey(0);return 0;
}

5_图像像素操作(加减乘除)

saturate_cast():防止像素外溢 运算完之后,结果为负,则转为0,结果超出255,则为255
add():像素相加
subtract():像素相减
multiply():像素相乘
divide():像素相除

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int artc, char** argv) {Mat src1 = imread("");Mat src2 = imread("");if (src1.empty() || src2.empty()) {printf("could not load image...\n");return -1;}namedWindow("input", WINDOW_AUTOSIZE);imshow("input1", src1);imshow("input2", src2);int height = src1.rows;int width = src1.cols;int b1 = 0, g1 = 0, r1 = 0;int b2 = 0, g2 = 0, r2 = 0;int b = 0, g = 0, r = 0;Mat result = Mat::zeros(src1.size(), src1.type());//代码实现两图像相加for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {b1 = src1.at<Vec3b>(row, col)[0];g1 = src1.at<Vec3b>(row, col)[1];r1 = src1.at<Vec3b>(row, col)[2];b2 = src2.at<Vec3b>(row, col)[0];g2 = src2.at<Vec3b>(row, col)[1];r2 = src2.at<Vec3b>(row, col)[2];result.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b1 + b2);//saturate_cast防止像素外溢  运算完之后,结果为负,则转为0,结果超出255,则为255result.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g1 + g2);result.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r1 + r2);}}imshow("output", result);Mat add_result = Mat::zeros(src1.size(), src1.type());//API实现图像相加add(src1, src2, add_result);imshow("add_result", add_result);Mat sub_result = Mat::zeros(src1.size(), src1.type());//API实现图像相减subtract(src1, src2, sub_result);imshow("sub_result", sub_result);Mat mul_result = Mat::zeros(src1.size(), src1.type());//API实现图像相乘multiply(src1, src2, mul_result);imshow("mul_result", mul_result);Mat div_result = Mat::zeros(src1.size(), src1.type());//API实现图像相除divide(src1, src2, div_result);imshow("div_result", div_result);waitKey(0);return 0;
}

输入图片1:
输入图片2:
输出图片1:
输出图片2:
输出图片3:
输出图片4:
输出图片5:

6_图像伪色彩增强

applyColorMap():将灰度图像转换成彩色图像,转换的模式达22种之多。详细接口形式可看源码

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;
void customColorMap(Mat& image);
int main(int argc, const char* argv[])
{Mat src = imread("");if (src.empty()){printf("could not load image...\n");return -1;}Mat gray, dst;applyColorMap(src, dst, COLORMAP_SUMMER);//将灰度图像转换成彩色图像imshow("colorMap", dst);cvtColor(src, gray, COLOR_BGR2GRAY);//灰度化imshow("gray", gray);customColorMap(gray);waitKey(0);return 0;
}void customColorMap(Mat& image) //二值化
{int lut[256];for (int i = 0; i < 256; i++) {if (i < 127)lut[i] = 0;elselut[i] = 255;}int h = image.rows;int w = image.cols;for (int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {int pv = image.at<uchar>(row, col);image.at<uchar>(row, col) = lut[pv];}}imshow("lut demo", image);
}

输入图片:

输出图片1:

输出图片2:

输出图片3:

7_图像像素操作(逻辑操作)

Rect:类成员变量x、y、width、height,分别为左上角点的坐标和矩形的宽和高
成员属性:
size()和area():
size()函数返回值就是一个size类型的变量,包括矩形的宽度和高度,area()函数返回了矩形的面积。
br()和tl():
br()返回右下角坐标(BottomRight),tl()返回矩形左上角坐标(TopLeft)。返回值类型均为Point
contains()和inside():
返回值为bool类型,用来描述点和矩形的相对位置的。
Sclar:用来设置颜色。三通道颜色排列顺序 B G R

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, const char* argv[])
{//创建第一个图片  400*400 三通道Mat src1 = Mat::zeros(Size(400, 400), CV_8UC3);//Rect类  x,y,height,widthRect rect(100, 100, 100, 100);src1(rect) = Scalar(0, 0, 255);imshow("input1", src1);printf("create first image...\n");//创建第二个图片Mat src2 = Mat::zeros(Size(400, 400), CV_8UC3);rect.x = 150;rect.y = 150;src2(rect) = Scalar(0, 0, 255);imshow("input2", src2);printf("create second image...\n");Mat dst1, dst2, dst3;bitwise_and(src1, src2, dst1);//像素与bitwise_xor(src1, src2, dst2);//像素异或bitwise_or(src1, src2, dst3);//像素或imshow("dst1", dst1);imshow("dst2", dst2);imshow("dst3", dst3);Mat src = imread("test.png");namedWindow("input", WINDOW_AUTOSIZE);imshow("input", src);Mat dst;bitwise_not(src, dst);//像素非imshow("dst", dst);waitKey(0);return 0;
}

输入图像:

输出图像1:

输出图像2:

输出图像3:

输出图像4:

输出图像5:

输出图像6:

输出图像7:

8_图像通道分离合并

**split()

OpenCV学习(函数)相关推荐

  1. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  2. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  3. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  4. opencv学习笔记18:canny算子边缘检测原理及其函数使用

    canny边缘检测原理 去噪:边缘检测容易受到噪声的影响,在此之间,先去噪,通常采用高斯滤波器.opencv学习笔记11:图像滤波(均值,方框,高斯,中值) 梯度:对去噪后的图像采用sobel算子计算 ...

  5. opencv学习笔记16:梯度运算之scharr算子及其函数使用

    前文介绍了sobel算子 opencv学习笔记14:sobel算子及其函数使用 scharr算子理论 系数和sobel不一样,其他一样. scharr函数使用 dst=cv2.Scharr(src,d ...

  6. 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...

    (7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...

  7. OpenCV 学习笔记-day13 像素值统计 统计计算最大最小值,平均值和标准差 (minMaxLoc()和meanStdDev()函数的使用)

    OpenCV 学习笔记 day13 像素值统计 函数 minMaxLoc(); 最大值最小值统计 meanStdDev();平均值和标准方差统计 代码 day13 像素值统计 函数 minMaxLoc ...

  8. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  9. OpenCV学习笔记(5)_ ellipse绘制函数浅析

    OpenCV学习笔记(5)_ ellipse绘制函数浅析 文章目录 OpenCV学习笔记(5)_ ellipse绘制函数浅析 1. ellipse第一种重载--绘制椭圆弧 1.1 函数原型 1.2 参 ...

  10. OpenCV学习笔记02--图像像素处理--二值图像、灰度图像、彩色图像像素的处理、numpy.array中的对应的函数

    目录 (一)灰度图像像素处理 (二)彩色图像像素处理 (三)numpy.array库在图像处理中的应用 (四)查看图像的属性信息 接着笔记01继续总结,当我们读取一幅图像的时候,一般为二值图像.灰度图 ...

最新文章

  1. 如何写出优质干净的代码,这6个技巧你不能错过!
  2. Linux/ubuntu 服务器开启6010端口-X11服务-ssh连接
  3. 第二层EtherChannel
  4. 构造代码块会想你所想
  5. 牛客题霸 [在转动过的有序数组中寻找目标值] C++题解/答案
  6. php会不会被人工智能取代,为什么这9种工作不会被人工智能取代?
  7. mysql-server rpm_Mysql rpm包安装
  8. Ubuntu安装Chromium
  9. es 使用ik停词_ES使用IK分词器
  10. 扩展Alibaba P3C 实现自定义代码规范检查
  11. 计算机发展的新技术,计算机新技术发展的有关论文
  12. 会议 | 百度首席科学家吴华图灵大会演讲:NLP技术的演变与发展
  13. mysql distance_MySql中的一些小坑
  14. SpringBoot+Mybatis-plus+aop实现一个类似JPA的@Audited注解(字段审计)功能
  15. 免费把你的 GoogleDrive 和 OneDrive 变成 CDN
  16. [Web] [微信小程序-云开发] 商城 无服务器 加后台管理
  17. 安东尼:为来欧洲踢球做出了牺牲,穿上曼联球衣让我很满足
  18. selenium基本知识点+浏览器隐私模式
  19. crh寄存器_寄存器简写
  20. 转载:毕业半年在富士康的经历

热门文章

  1. OSChina 周五乱弹 —— 看来我只适合当一个千斤顶
  2. 使用calibre给电子书生成目录
  3. Vue3 - Element plus 实现 “带分页“ 表格组件,实现跨页进行 “分页勾选“ 的多选功能(解决分页表格组件 <el-table> 跨页后已前勾选的行自动消失问题)详细示例解决教程
  4. 安卓开发新手入门教程!Android学习路线指南,复习指南
  5. 《信号与系统》很难?也许你应该看看这篇文章
  6. 表格内容单/多行展示(一)- 单行/多行显示的方法
  7. PDFBox实现图片转PDF --JAVA
  8. 微信授权登录接口合集
  9. C语言利用二叉树的操作实现根据给定的字符串生成二叉树并前序、中序、后序输出二叉树。
  10. 负317是几位数在计算机课中,计算机应用基础数据在计算机中的表示ppt课件