opencv(1)

quickopencv.h

#include <opencv2/opencv.hpp>
using namespace cv;
class quickdemo {
public:void colorSpace_Demo(Mat &image);
};

quockdemo.cpp

色彩空间转换函数-cvtColor

#include "quickopencv.h"
void quickdemo::colorSpace_Demo(Mat &image) {Mat gray, hsv;cvtColor(image, hsv, COLOR_BGR2HSV);cvtColor(image, gray, COLOR_BGR2GRAY);namedWindow("HSV", WINDOW_FREERATIO);imshow("HSV", hsv);//色相h:0- 180 饱和度s 亮度vnamedWindow("灰度", WINDOW_FREERATIO);imshow("灰度", gray);imwrite("C:/Users/嘻嘻哈哈/Pictures/hsv.png",hsv);//三个参数 第一个是图像保存路径,第二个是图像内存对象imwrite("C:/Users/嘻嘻哈哈/Pictures/gray.png", gray);}

main.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include "quickopencv.h"
using namespace cv;
using namespace std;
int main(int argc, char** argv) {Mat src = imread("C:/Users/嘻嘻哈哈/Pictures/微信图片_20210929221856.jpg");//由imread读出的照片都是8位的namedWindow("输入窗口", WINDOW_FREERATIO);//可调大小的窗口形式imshow("输入窗口", src);//只能输出8位的quickdemo qd;qd.colorSpace_Demo(src);waitKey(0);destroyAllWindows();return 0;
}

opencv(2)

1.怎么操作Mat 以及怎么访问每一个像素点

void quickdemo::mat_creation_demo(Mat &image) {Mat m1, m2;m1 = image.clone();//克隆image.copyTo(m2);//拷贝//创建空白图像Mat m3 = Mat::zeros(Size(40, 40), CV_8UC3); //CV_8UC1 :(Unsigned无符号的),(1:单通道的)8位m3=Scalar(1, 1, 1);//通道赋值,知道几个通道就赋几个值,可通过他修改空白图像颜色std::cout << "宽度:" << m3.cols << "高度:" << m3.rows << "通道数:" << m3.channels() << std::endl;std::cout << m3 << std::endl;imshow("创建图像", m3);}

CV_8UC1:每个像素点的通道数是1

CV_8UC3:每个像素点的通道数是3

Mat m3 = Mat::ones(Size(8, 8), CV_8UC1);只会使第一个通道是1;

m3=Scalar(1, 1, 1);//通道赋值,知道几个通道就赋几个值,可通过他修改空白图像颜色

3.怎么创建一个空图或Mat

Mat之克隆m3.clone():修改m4不会对m3进行修改

Mat之克隆m3.copyTo(m4):修改m4不会对m3进行修改

Mat m3 = Mat::zeros(Size(40, 40), CV_8UC3); m3=Scalar(1, 1, 1);
imshow("图像3", m3);Mat m4 = m3.clone();//克隆//m3.copyTo(m4);//copyTo复制m4 = Scalar(200, 200, 200);imshow("图像4", m4);

运行结果:

Mat之赋值m3=m4:修改m4会对m3进行修改

imshow("图像3", m3);Mat m4 =m3;m4 = Scalar(200, 200, 200);imshow("图像3", m3);

运行结果:

前两者相当于深拷贝,后者相当于浅拷贝

重载运算符=是浅拷贝,共享内存空间,互相影响,clone是深拷贝,内存空间不同,相互独立,互不打扰;

opencv(3):对图像像素读写操作

1、基于数组

void quickdemo::pixel_visit_demo(Mat &image) {int w = image.cols;//宽,列int h = image.rows;//高,行int dims = image.channels();//通道数,等于1代表是灰度图像,等于3代表是彩色图像for (int row = 0; row < h; row++) {//双重for循环for (int col = 0; col < w; col++) {if (dims == 1) {//灰度图像int pv = image.at<uchar>(row, col);//将像素点转变为int类型,获取到一个值image.at<uchar>(row, col) = 255 - pv;//uchar范围:0-255(2的8次方)}if (dims == 3) {//彩色图像Vec3b bgr=image.at<Vec3b>(row, col);//浮点数就是Veb3f,获取到三个值,相当于一个数组image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];}}}imshow("像素读写显示",image);
}

运行结果:

2、基于指针:速度要快于数组(i++ 用的巧妙)

void quickdemo::pixel_visit_demo(Mat &image) {int w = image.cols;//宽,列int h = image.rows;//高,行int dims = image.channels();//通道数,等于1代表是灰度图像,等于3代表是彩色图像for (int row = 0; row < h; row++) {//双重for循环uchar *current_row = image.ptr<uchar>(row);//指针指向这一行,获取这一行的地址for (int col = 0; col < w; col++) {if (dims == 1) {//灰度图像int pv = *current_row;//将像素点转变为int类型,获取到这个地址的值*current_row++ = 255 - pv;//++的是列数,即cols}if (dims == 3) {//彩色图像Vec3b bgr = image.at<Vec3b>(row, col);//浮点数就是Veb3f,获取到三个值,相当于一个数组*current_row++ = 255 - *current_row;//先减再自加,三行则是对三个通道都进行操作*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}}imshow("像素读写显示",image);
}

运行结果:与上面图一样

opencv(4):对图像像素算数操作

加减乘除都不会超过255也不会小于0,若超过255则会默认调至255,小于0则默认为0

multiply(image, m, dst);//乘法
    divide(image, m, dst);//除法
    add(image, m, dst);//加法
    subtract(image, m, dst);//减法

void quickdemo::operators_demo(Mat &image) {Mat dst;//dst = image + Scalar(50, 50, 50);//加法操作,图像变亮,减法变暗//imshow("加法操作",dst);//dst = image * Scalar(2, 2, 2);乘法操作,不可直接乘,要用专业函数multiply(乘数1,乘数2,积)Mat m = Mat::zeros(image.size(), image.type());//创建一个和传过来的图片大小、类型相同的图像m = Scalar(2, 2, 2);multiply(image, m, dst);//乘法divide(image, m, dst);//除法add(image, m, dst);//加法subtract(image, m, dst);//减法imshow("乘法操作", dst);
}

乘法运行结果:

 opencv(5):滚动条操作演示-调整图像亮度

createTrackbar()函数:通过改变滑动条的位置来改变函数里面变量的值

函数有6个参数:

参数1:轨迹条名字

参数2:窗口名字

参数3:滑块初始位置

参数4:表示滑块达到最大位置的值

参数5:默认值为0,指向回调函数

参数6:默认值为0,用户传给回调函数的数据值

createTrackbar("Value Bar", "亮度调整", &lightness, max_value, on_track,(void*)(&image));

static void on_track(int b, void* userdata) {//回调函数Mat image = *((Mat*)userdata);Mat dst = Mat::zeros(image.size(), image.type());Mat m= Mat::zeros(image.size(), image.type());m = Scalar(b, b, b);subtract(image, m, dst);imshow("亮度调整", dst);
}
void quickdemo::tracking_bar_demo(Mat &image) {namedWindow("亮度调整", WINDOW_AUTOSIZE);int max_value = 100;int lightness = 50;createTrackbar("Value Bar", "亮度调整", &lightness, max_value, on_track,(void*)(&image));on_track(50, &image);
}

效果展示:

addWeighted()函数是将两张相同大小,相同类型的图片融合的函数

六个参数:

参数1:src1,第一个原数组.
参数2:alpha,第一个数组元素权重

参数3:src2第二个原数组
参数4:beta,第二个数组元素权重
参数5:gamma,图1与图2作和后添加的数值。

参数6:dst,输出图片

eg:

addWeighted(src1,0.5,src2,0.7,3,dst);

参数分别为:图1,图1的权重,图2,图2的权重,权重和添加的值为3,输出图片src

对比度调整:

注意:imshow里面的名称要统一,否则会出现错误

代码如下:

static void on_lightness(int b, void* userdata) {//回调函数,亮度调整Mat image = *((Mat*)userdata);Mat dst = Mat::zeros(image.size(), image.type());Mat m= Mat::zeros(image.size(), image.type());addWeighted(image,1.0,m,0,b,dst);imshow("亮度与对比度调整", dst);
}
static void on_contract(int b, void* userdata) {//回调函数,对比度调整Mat image = *((Mat*)userdata);Mat dst = Mat::zeros(image.size(), image.type());Mat m = Mat::zeros(image.size(), image.type());double contrast = b / 100.0;addWeighted(image, contrast, m, 0.0, b, dst);imshow("亮度与对比度调整", dst);
}
void quickdemo::tracking_bar_demo(Mat &image) {namedWindow("亮度与对比度调整", WINDOW_AUTOSIZE);int lightness = 50;int max_value = 100;//亮度调整int contrast_value = 100;createTrackbar("Value Bar", "亮度与对比度调整", &lightness, max_value, on_lightness,(void*)(&image));createTrackbar("Contrast Bar", "亮度与对比度调整", &lightness, max_value, on_contract, (void*)(&image));on_lightness(50, &image);on_contract(50, &image);
}

opencv---c++相关推荐

  1. OpenCV 笔记(09)— 常用的数据结构和函数(Vec、Point、Scalar、Size、Rect、cvtColor)

    1. Vec 对象类型 Vec 是一个主要用于数值向量的模板类.我们可以定义向量的类型和组件的数量: Vec<double, 19> myVector 我们还可以使用任何的预定义类型: t ...

  2. OpenCV 笔记(08)— 二维点、三维点、基于 Mat 的 std::vector 等常用数据结构的定义和输出

    1. 定义和输出二维点 Point2f p2(3, 4);cout << "[二维点] is "<< endl << p2 << e ...

  3. OpenCV 笔记(07)— Mat 对象输出格式设置(Python 格式、CSV 格式、NumPy 格式、C 语言格式)

    首先是下面代码中将要使用的 r 矩阵的定义.需要注意,我们可以通过用 randu 函数产生的随机值来填充矩阵, 需要给定一个上限和下限来确保随机值在期望的范围内. Mat r = Mat(2, 3, ...

  4. OpenCV 笔记(06)— Mat 结构、像素值存储方法、创建 Mat 对象各种方法、Mat 对象的运算

    数字图像中的每个点都称为像素(对于图像元素),并且每个像素可以存储一个或多个值,这取决于它是否是仅存储一个值的黑白图像(也称为二进制图像,比如只存储0或1),还是存储两个值的灰度图像,或者是存储三个值 ...

  5. OpenCV 笔记(05)— opencv.hpp 头文件作用(是其它所有头文件的全集)

    在编辑器中通过点击 #include "opencv2/opencv.hpp" 头文件就可以看到该头文件的定义如下 #ifndef OPENCV_ALL_HPP #define O ...

  6. OpenCV 笔记(03)— 读取视频、通过摄像头采集视频、采集视频 canny 边缘检测

    我们本节学习如何利用 OpenCV 中的 VideoCapture 类,来对视频进行读取显示,以及调用摄像头. VideoCapture 它提供了从摄像机或视频文件捕获视频的 C++ 接口, 作用是从 ...

  7. OpenCV 笔记(02)— 图像显示、保存、腐蚀、模糊、canny 边缘检测(imread、imshow、namedWindow、imwrite)

    OpenCV 提供两种用户界面选项: 基于原生用户界面的基本界面,适用于 Mac OS X 的 cocoa 或 carbon,以及适用于 Linux 或 Windows 用户界面的 GTK ,这些界面 ...

  8. OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能

    1. OpenCV 概念 图像处理( Image Processing )是用计算机对图像进行分析, 以达到所需结果的技术, 又称影像处理. 图像处理技术一般包括图像压缩, 增强和复原, 匹配.描述和 ...

  9. Python+OpenCV 图像处理系列(9)—— 图像的翻转和缩放插值

    1. 图像的翻转 图像翻转 (Image Flip),图像翻转的本质像素映射,OpenCV 支持三种图像翻转方式: X轴翻转,flipcode = 0 Y轴翻转, flipcode = 1 XY轴翻转 ...

  10. Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值

    1. Numpy 相关知识 1.1 Ndarray 对象 在了解 OpenCV 的图像对象之前我们先对 NumPy 的基础知识做一回顾,方便我们后续更进一步理解图像对象的一系列操作. In [2]: ...

最新文章

  1. 项目:网站架构,集群
  2. jieba 词典 词频_在Hanlp词典和jieba词典中手动添加未登录词
  3. 频谱扩展 matlab,语音信号频谱扩展
  4. legend函数_ggplot的图例(legend)管理
  5. Linux 系统下 /etc/group 档案结构
  6. 【windows核心编程】IO完成端口(IOCP)复制文件小例
  7. Linux中文档与目录的特殊权限
  8. MySQL时间函数timestampdiff()使用
  9. 联考事业单位计算机类面试,2018年5.26事业单位联考E类常见面试题(上)
  10. 几种常用的网络传输协议
  11. dbgView的使用
  12. 精密电阻阻值表丝印大全
  13. 深击 | 阿里云故障“惊魂”1小时:难道我们是那0.1%?
  14. 集线器,路由器,交换机的作用和差别是什么?怎样区分交换机,集线器,路由器?
  15. jsp+eclipse图片显示不出来
  16. vim的大小写转换方法总结
  17. python怎么输入括号
  18. Java校招面经_小米java校招面经,面试题整理(一面)
  19. android型号手机怎么截图,如何在Android手机上屏幕截图(仅限Rooted Phone) | MOS86...
  20. 基于深度学习的多任务人脸属性分析(基于飞桨PaddlePaddle)

热门文章

  1. 腾讯IVWEB团队:如何搭建高质量、高效率的前端工程体系 页面结构继承
  2. iOS开发 处理置顶聊天的功能
  3. jQuery UI 使用心得及技巧
  4. 电信重组:移动圈地联通抢山头 电信干等
  5. 华为发展鸿蒙系统再出奇招,为了留存现有手机用户可谓费尽脑汁
  6. Games101-闫令琪 1-4讲 基础知识+变换 (笔记整理)
  7. h1z1最新消息服务器,h1z1服务器在哪 | 手游网游页游攻略大全
  8. python webpy启动服务
  9. 【荣耀开发者服务平台—百亿曝光扶持等你来】智慧服务快应用卡片接入指南(下)
  10. HDFS开启HA后,Hbase的REGIONSERVERS启动错误(Operation category READ is not supported in state standby)