目录

  • VS2019 + opencv环境安装
  • OpenCV简单介绍(摘抄百度百科)
  • 知识点总结(主要总结的是图像分割)
    • 1.图像的加载、修改、保存
    • 2.矩阵的掩模操作
    • 3. Mat的简单用法
    • 4. 读写像素
    • 5. 图像混合
    • 6. 调整图像亮度和对比度
    • 7. 绘制形状和文字

VS2019 + opencv环境安装

1) 本人的环境是VS2019 + OpenCV
VS2019 社区版就够了(自己注册微软账号) 下载链接:link.

2) VS2019 opencv配置 网上有很多安装方法这边就不具体介绍了
下载opencv安装包(我下载的是3.4.11版本,其他版本还没试过) 下载链接:link

OpenCV简单介绍(摘抄百度百科)

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。

应用领域:
1、人机互动
2、物体识别
3、图像分割
4、人脸识别
5、动作识别
6、运动跟踪
7、机器人
8、运动分析
9、机器视觉
10、结构分析
11、汽车安全驾驶

知识点总结(主要总结的是图像分割)

1.图像的加载、修改、保存

1.imread 加载图片
Mat imread( const string& filename, int flags = 1 )
2.namedWindow 创建窗口,自动创建和释放无需销毁
void cv::namedWindow(const cv::String &winname, int flags = 1)
3.imshow 显示创建的窗口
void cv::imshow(const cv::String &winname, cv::InputArray mat)
4.cvtColor 修改图像颜色
void cv::cvtColor(cv::InputArray src, cv::OutputArray dst, int code, int dstCn = 0)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;//使用命名空间cv,使用过C++的都明白,我们写C++程序必须使用using namespace std
using namespace std;int main(int argc, char** argv) {Mat src = imread("E:/fireBall.jpg");//读图片,加载//Mat我们可以理解为一个存储数据的容器,定义了一个img对象来存图片的数据if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);//创建一个OpenCV窗口,自动创建和释放无需销毁imshow("test opencv setup", src);//显示窗口namedWindow("output window", CV_WINDOW_AUTOSIZE);Mat output_image;cvtColor(src, output_image, CV_BGR2HSV);//修改图像颜色imshow("output window", output_image);imwrite("E:/hlstrest.jpg", output_image);//保存图片waitKey(0);//等待按下函数:参数如果写负数或者0。当显示图片后,按下任意键后程序退出。如果参数写为3000就是3秒后程序自动退出return 0;
}

2.矩阵的掩模操作

掩模操作实现图像对比度的提高

获取图像像素指针
CV_Assert(myImage.depth() == CV_8U);
Mat.ptr<uchar>(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
获得当前行指针const uchar*  current= myImage.ptr<uchar>(row );
获取当前像素点P(row, col)的像素值 p(row, col) =current[col]像素范围处理saturate_cast<uchar>
saturate_cast<uchar>(-100),返回 0。
saturate_cast<uchar>(288),返回255
saturate_cast<uchar>(100),返回100
这个函数的功能是确保RGB值得范围在0~255之间

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;//使用命名空间cv,使用过C++的都明白,我们写C++程序必须使用using namespace std
using namespace std;int main(int argc, char** argv) {Mat src, drt;src = imread("E:/fireBall.jpg");if (!src.data) {printf("could not load image...\n");return -1;}namedWindow("input image", CV_WINDOW_AUTOSIZE);imshow("input image", src);int cols = (src.cols - 1) * src.channels();// 边缘的像素点的不做处理int offsetx = src.channels();int rows = src.rows;drt = Mat::zeros(src.size(), src.type());// 创建一个和scr一样大小的,类型一样的全黑图像。//掩模操作************//for (int row = 1; row < (rows - 1); row++) {const uchar* previous = src.ptr<uchar>(row - 1);const uchar* current = src.ptr<uchar>(row);const uchar* next = src.ptr<uchar>(row + 1);uchar* output = drt.ptr<uchar>(row);for (int col = offsetx; col < cols; col++) {output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));}}//掩模操作*************///*//把上面的掩膜操作,注释掉,就这两行就可以代替。double t = getTickCount();//获取时间Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);//定义掩模filter2D(src, drt, src.depth(), kernel);//APIdouble timeconsume = (getTickCount() - t) / getTickFrequency();//获取执行时间printf("tim consume %.2f\n", timeconsume);*/namedWindow("contrast image demo", CV_WINDOW_AUTOSIZE);imshow("contrast image demo", drt);waitKey(0);return 0;
}

3. Mat的简单用法

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;//使用命名空间cv,使用过C++的都明白,我们写C++程序必须使用using namespace std
using namespace std;int main(int argc, char** argv) {Mat src;src = imread("E:/fireBall.jpg");if (src.empty()) {cout << "could not load image..." << endl ;return -1;}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src);*/Mat dst;dst = Mat(src.size(), src.type());dst = Scalar(127, 0, 255);namedWindow("output", CV_WINDOW_AUTOSIZE);imshow("output", dst);//Mat dst = src.clone();//克隆//Mat dst;src.copyTo(dst);//复制namedWindow("output", CV_WINDOW_AUTOSIZE);cvtColor(src, dst, CV_BGR2GRAY);cout << "input channels :   " << src.channels() << endl;cout << "output channels :   " << dst.channels() << endl;int cols = dst.cols;int rows = dst.rows;const uchar* firstRow = dst.ptr<uchar>(0);cout << "rows :  " << rows << "  cols : " << cols << endl;cout << "first pixel value :  " << *firstRow << endl;Mat M(100, 100, CV_8UC3, Scalar(0, 0, 255));//cout << "M = " << endl << M << endl;imshow("output", M);waitKey(0);return 0;
}

4. 读写像素

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;//使用命名空间cv,使用过C++的都明白,我们写C++程序必须使用using namespace std
using namespace std;int main(int argc, char** argv) {Mat src, gray_src;src = imread("E:/fireBall.jpg");if (src.empty()) {cout << "could not load image..." << endl;return -1;}namedWindow("input", CV_WINDOW_AUTOSIZE);imshow("input", src); cvtColor(src, gray_src, CV_BGR2GRAY);//图像变灰namedWindow("output", CV_WINDOW_AUTOSIZE);imshow("output", gray_src);int height = gray_src.rows;int width = gray_src.cols;//单通道for (int row = 0; row < height; row++){for (int col = 0; col < width; col++) {int gray = gray_src.at<uchar>(row, col);gray_src.at<uchar>(row, col) = 255 - gray;//反差图片}}imshow("output", gray_src);Mat dst;dst.create(src.size(), src.type());height = src.rows;width = src.cols;int nc = src.channels();//三通道for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {if (nc == 1) {int gray = gray_src.at<uchar>(row, col);gray_src.at<uchar>(row, col) = 255 - gray;}else if (nc == 3) {int b = src.at<Vec3b>(row, col)[0];int g = src.at<Vec3b>(row, col)[1];int r = src.at<Vec3b>(row, col)[2];dst.at<Vec3b>(row, col)[0] = 255 - b;dst.at<Vec3b>(row, col)[1] = 255 - g;dst.at<Vec3b>(row, col)[2] = 255 - r;}}}//bitwise_not(src, dst);//API反位操作//求反差图片imshow("output", dst);waitKey(0);return 0;
}

5. 图像混合

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;//使用命名空间cv,使用过C++的都明白,我们写C++程序必须使用using namespace std
using namespace std;int main(int argc, char** argv) {Mat src1, src2, dst;src1 = imread("E:/1.png");src2 = imread("E:/2.png");if (src1.empty()) {cout << "could not load image..." << endl;return -1;}if (src2.empty()) {cout << "could not load image..." << endl;return -1;}double alpha = 0.5;if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) {addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);//add(src1, src2, dst, Mat());//图像普通相加//multiply(src1, src2, dst, 1.0);//图像相乘imshow("src1", src1);imshow("src2", src2);namedWindow("blend demo", CV_WINDOW_AUTOSIZE);imshow("blend demo", dst);}else {cout << "could not blend images , the size of imagers is not same... \n" << endl;return -1;}waitKey(0);return 0;
}

6. 调整图像亮度和对比度

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;//使用命名空间cv,使用过C++的都明白,我们写C++程序必须使用using namespace std
using namespace std;Mat src, dst;src = imread("E:/fireBall.jpg");if (src.empty()) {cout << "could not load image..." << endl;return -1;}char input_win[] = "input image";//cvtColor(src, src, CV_RGB2GRAY);//转为单通道namedWindow(input_win, CV_WINDOW_AUTOSIZE);imshow("input", src);//contrast and brightness changeint height = src.rows;int width = src.cols;dst = Mat::zeros(src.size(), src.type());float alpha = 1.2;//对比度float beta = 30;//亮度Mat ml;src.convertTo(ml, CV_32F);for (int row = 0; row < height; row++) {for (int col = 0; col < width; col++) {if (src.channels() == 3) {float b = ml.at<Vec3f>(row, col)[0];float g = ml.at<Vec3f>(row, col)[1];float r = ml.at<Vec3f>(row, col)[2];dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);//公式dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha + beta);}else if (src.channels() == 1) {float v = src.at<uchar>(row, col);dst.at<uchar>(row, col) = saturate_cast<uchar>(v * alpha + beta);}}}char output_title[] = "contrast and brightness change demo";namedWindow(output_title, CV_WINDOW_AUTOSIZE);imshow(output_title, dst);waitKey(0);return 0;
}

7. 绘制形状和文字

函数

1.直线
void cv::line(cv::InputOutputArray img, cv::Point pt1, cv::Point pt2, const cv::Scalar &color, int thickness = 1, int     lineType = 8, int shift = 0)
2.矩形
void cv::rectangle(cv::Mat &img, cv::Rect rec, const cv::Scalar &color, int thickness = 1, int lineType = 8, int shift =    0)
3.椭圆
void cv::ellipse(cv::InputOutputArray img, cv::Point center, cv::Size axes, double angle, double startAngle, double     endAngle, const cv::Scalar &color, int thickness = 1, int lineType = 8, int shift = 0)
4.圆
void cv::circle(cv::InputOutputArray img, cv::Point center, int radius, const cv::Scalar &color, int thickness = 1, int     lineType = 8, int shift = 0)
5.填充区域
void cv::fillPoly(cv::Mat &img, const cv::Point **pts, const int *npts, int ncontours, const cv::Scalar &color, int     lineType = 8, int shift = 0, cv::Point offset = cv::Point())
6.文字水印
void cv::putText(cv::InputOutputArray img, const cv::String &text, cv::Point org, int fontFace, double fontScale, cv::    Scalar color, int thickness = 1, int lineType = 8, bool bottomLeftOrigin = false)
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>using namespace cv;
using namespace std;Mat bgImge;
const char* drawdemo_win = "draw shapes and text demo";//直线
void MyLines() {Point p1 = Point(20, 30);Point p2;p2.x = 300;p2.y = 300;Scalar color = Scalar(0, 0, 255);line(bgImge, p1, p2, color, 1, LINE_8);
}//矩形
void MyRectangle() {Rect rect = Rect(200, 100, 300, 300);Scalar color = Scalar(255, 0, 255);rectangle(bgImge, rect, color, 2, LINE_8);
}//椭圆
void MyEllipse() {Scalar color = Scalar(255, 0, 255);ellipse(bgImge, Point(bgImge.cols / 2, bgImge.rows / 2), Size(bgImge.cols / 4, bgImge.rows / 8), 90, 0, 360, color, 2, LINE_8);
}//圆
void MyCircle() {Scalar color = Scalar(0, 255, 255);Point center = Point(bgImge.cols / 2, bgImge.rows / 2);circle(bgImge, center, 100, color, 2, 8);
}//填充区域
void MyPolygon() {Point pts[1][5];pts[0][0] = Point(100, 100);pts[0][1] = Point(100, 200);pts[0][2] = Point(200, 200);pts[0][3] = Point(200, 100);pts[0][4] = Point(100, 100);const Point* ppts[] = { pts[0] };int  npt[] = { 5 };Scalar color = Scalar(255, 12, 255);fillPoly(bgImge, ppts, npt, 1, color, 8);
}//随机线条
void RandomLineDemo() {RNG rng(12345);//生成随机数Point pt1;Point pt2;Mat bg = Mat::zeros(bgImge.size(), bgImge.type());namedWindow("random line demo", CV_WINDOW_AUTOSIZE);for (int i = 0; i < 100000; i++) {pt1.x = rng.uniform(0, bgImge.cols);pt2.x = rng.uniform(0, bgImge.cols);pt1.y = rng.uniform(0, bgImge.rows);pt2.y = rng.uniform(0, bgImge.rows);Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));if (waitKey(50) > 0) {break;}line(bg, pt1, pt2, color, 1, 8);imshow("random line demo", bg);}
}

在此说明,知识点为博主从b站up ggi2016 学习的总结,如有侵权,可私信于我。
学习小白,若有错误,还望指正,山高水长。。。

Opencv 环境安装以及学习图像处理知识总结(附代码)(一)相关推荐

  1. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  2. python开发微信群_Python编程:微信群聊程序的开发与进/线程知识汇总(附代码)

    本文承接上篇文章的客户端-服务器聊天对话程序,进一步设计开发了微信群聊的python模拟程序,涉及的python知识点为:Python实战:聊天软件开发与TCP/Socket编程知识汇总(附代码)和 ...

  3. python学习环境安装_python学习系列----环境的安装

    最近又想捣鼓下Python了,一来也是给自已找点事吧,毕竟做这行不进则退呀:我平时上班是做PHP的.所以其它时候还是想通过多学习提高下自已吧.好了,废话说完了,正题       其实以前也用过Pyth ...

  4. OpenCV语义细分深度学习网络的实例(附完整代码)

    OpenCV语义细分深度学习网络的实例 OpenCV语义细分深度学习网络的实例 OpenCV语义细分深度学习网络的实例 #include <fstream> #include <ss ...

  5. OpenCV运行分类深度学习网络的实例(附完整代码)

    OpenCV运行分类深度学习网络的实例 OpenCV运行分类深度学习网络的实例 OpenCV运行分类深度学习网络的实例 #include <fstream> #include <ss ...

  6. 单元测试在深度学习中的应用 | 附代码「AI产品/工程落地」

    关注:决策智能与机器学习,深耕AI脱水干货 作者 |   Tilman Krokotsch 编译 |   ronghuaiyang   报道 |  AI公园 导读 本文非常详细的介绍并演示了如何将单元 ...

  7. MPE环境安装-强化学习的小demo

    这里写自定义目录标题 MPE的前世今生 MPE安装 准备工作 环境配置 开始安装 测试 关于如何将你的虚拟环境和pycharm统一 MPE的前世今生 MPE(Multi-Agent Particle ...

  8. 学习python环境安装_Python学习环境安装,python

    1.python 安装,官网下载,之前已经安装过,这里不再说明 2.安装PyCharm 下载后双击程序安装,注意要选择(add to path),否则安装后要设置环境变量 3.安装PyCharm格式化 ...

  9. linux 环境安装及学习

    一.Httpd Linux(Apache)Httpd服务器安装,启动及httpd.conf配置详解   https://blog.51cto.com/itwish/2160492 httpd-2.4. ...

最新文章

  1. 生成对抗网络在深度学习中占据非常重要的位置
  2. 【MM】基于收货的发票校验Bapi Demo
  3. wxWidgets:wxGridEditorCreatedEvent类用法
  4. 牛客题霸 [括号生成] C++题解/答案
  5. 用keepalived配置高可用集群
  6. slice indices must be integers or None or have an __index__ method
  7. C++中将数据(或图像数据)写到txt
  8. Pascal VOC2012
  9. opencv3编程入门毛星云(第五章节5.2)
  10. OpenCV 帧差法
  11. 2022最火的一款网盘赚钱系统源码 仿制蓝奏网盘/城通网盘/分享赚钱云盘系统/网盘VIP下载系统
  12. 网站访问慢?如何优化网站访问速度?
  13. linux 查看ps命令大全,linux中ps命令使用大全
  14. 文件模式为 rw-r r linux,linux中-rw-rw-r-- l 是什么意思啊,linux 里命令ls -l 后,文件类型权...
  15. 膜拜性转帖: C++11有关的(现在用的编译器都是不太支持C++11的)
  16. 牛客假日团队赛6 F:Mud Puddles
  17. iOS 调用TouchID 身份验证
  18. Feature Selective Anchor-Free Module for Single-Shot Object Detection论文阅读翻译 - 2019CVPR
  19. win7 wi-fi热点_如何将Windows PC变成Wi-Fi热点
  20. 计算机考研公共课考英语几,新文道教育:2022考研必须要了解的30个知识点

热门文章

  1. python数据分析实例—— 上海餐饮店数据
  2. 台式计算机无法读取dvd,电脑光驱无法读取光盘原因
  3. windows7 防火墙关于文件共享的设置
  4. 初识Python(小白必看)
  5. 如何在浏览器中运行Linux程序,如何在Chromebook的浏览器标签中运行完整的Linux桌面 | MOS86...
  6. LOG,Harris,SUSAN角点及边缘检测原理和代码实现
  7. 狗屁不通文章生成器Java版
  8. 牢记公式,ardupilot EKF2就是纸老虎(二)!
  9. 13 1602液晶显示屏
  10. 云鸽笔记|技术复盘与总结