OpenCV(一)图像读取与新建、图像显示、操作图像像素(2种涂色并比较算法优劣、输出RGB)
目录
一、读取图像与新建图像
1、读取图像
2、新建图像
二、显示图像
1、过程
2、代码
3、运行效果
三、操作图像像素
1、逐RGB涂色(单循环)(快)
1-1、过程
2-2、代码
2-3、运行结果
2、逐行涂色(双循环)(慢)
3、算法快慢比较
总代码
一、读取图像与新建图像
注:如果是添加新图(非读取),必须要新建图像,否则会报错(没有初值)。
总而言之,图像必须有初值,这个初值要么读取获得,要么新建获得。
1、读取图像
img = imread("Resource/test.jpg");
2、新建图像
dst = Mat::zeros(img.size(), img.type());
分别需要填入图片大小和图片类型 。
二、显示图像
1、过程
1、打开图像;
2、新建窗口
3、在窗口中显示图像
2、代码
//显示图像
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;int main()
{//1、打开图像Mat img = imread("Resource/test.png");//图像为空if (img.empty())cout << "can not find the image!\n";//设置窗口(可以不要)namedWindow("图像", WINDOW_AUTOSIZE); //新建一个显示窗口,命名并指定窗口的类型(这里为固定)// WINDOW_NORMAL //可调控//2、在窗口中显示imshow("图像", img);waitKey(0); //等待
}
3、运行效果
三、操作图像像素
三通道(RGB):
1、逐RGB涂色(单循环)(快)
1-1、过程
指针指向首元素地址
//获取矩阵数据的起始地址
uchar* p = image.ptr<uchar>(0);
//图像的指针用法举例
cv::Mat image = cv::Mat(400, 600, CV_8UC1); //定义了一个Mat变量image。
uchar * data00 = image.ptr<uchar>(0); //data00是指向image第1行第1个元素的指针。
uchar * data10 = image.ptr<uchar>(1); //data10是指向image第1行第1个元素的指针。
uchar * data01 = image.ptr<uchar>(0)[1]; //data01是指向image第1行第2个元素的指针。
一共运行length次,length是rgb总数
//总RGB个数int length = image.cols * image.rows * image.channels();//总RGB个数 = 行数*列数*通道数 (总像素=行数*列数 转化为RGB->乘RGB数量(即通道数)//三通道:RGB
2-2、代码
//逐RGB涂色(单循环)
void setAllWhite(Mat& image)
{int i;//总RGB个数int length = image.cols * image.rows * image.channels();//总RGB个数 = 行数 * 列数 * 通道数 (总像素=行数*列数 转化为RGB->乘RGB数量(即通道数)//三通道:RGB//获取矩阵数据的起始地址uchar* p = image.ptr<uchar>(0);///逐rgb涂色for (i = 0; i < length; i++){//data[i] = 150; (*p++) = 150; //涂色(逐RGB)}
}
2-3、运行结果
2、逐行涂色(双循环)(慢)
(同上)指针指向首元素地址
//获取矩阵数据的起始地址
uchar* p = image.ptr<uchar>(0);
//图像的指针用法举例
cv::Mat image = cv::Mat(400, 600, CV_8UC1); //定义了一个Mat变量image。
uchar * data00 = image.ptr<uchar>(0); //data00是指向image第1行第1个元素的指针。
uchar * data10 = image.ptr<uchar>(1); //data10是指向image第1行第1个元素的指针。
uchar * data01 = image.ptr<uchar>(0)[1]; //data01是指向image第1行第2个元素的指针。
逐行 涂色image.rows,再在循环中逐rgb涂色image.cols * image.channels()。
//逐行涂色(双循环)
void setAllWhiteRows(Mat& image)
{int i, j;//获取矩阵数据的起始地址uchar* p = image.ptr<uchar>(0);for (i = 0; i < image.rows; i++) //逐行{for (j = 0; j < image.cols * image.channels(); j++) //逐rgb{(*p++) = 150; //涂色(逐RGB)}}
}
3、算法快慢比较
运用时间获取函数colck(),开始时计时一次,结束时计时一次,差值即为算法运行时间。
clock()返回ms,需要获取s,所以除1000
//比较两种算法的运行速度
void compareTime(Mat& image)
{int count = 10;long begin, end;//统计单循环方式(逐像素)运行时间begin = clock();while (count-- > 0)setAllWhite(image); //运行end = clock();printf("Single loop time is %f .\n", (double)(end - begin) / (double)CLOCKS_PER_SEC);// clock()以ms计,需要除1000才能获取到s//统计双循环方式(逐行)运行时间count = 10;begin = clock();while (count-- > 0)setAllWhiteRows(image); //运行end = clock();printf("Double loop time is %f \n", (double)(end - begin) / (double)CLOCKS_PER_SEC);
}
总代码
//图像逐像素的操作
//单循环:逐个对每个像素进行赋值
//双循环:逐行对每个像素进行赋值
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;//逐RGB涂色(单循环)
void setAllWhite(Mat& image)
{int i;//总RGB个数int length = image.cols * image.rows * image.channels();//总RGB个数 = 行数 * 列数 * 通道数 (总像素=行数*列数 转化为RGB->乘RGB数量(即通道数)//三通道:RGB//获取矩阵数据的起始地址uchar* p = image.ptr<uchar>(0);///逐rgb涂色for (i = 0; i < length; i++){//data[i] = 150; (*p++) = 150; //涂色(逐RGB)}
}//逐行涂色(双循环)
void setAllWhiteRows(Mat& image)
{int i, j;//获取矩阵数据的起始地址uchar* p = image.ptr<uchar>(0);for (i = 0; i < image.rows; i++) //逐行{for (j = 0; j < image.cols * image.channels(); j++) //逐rgb{(*p++) = 150; //涂色(逐RGB)}}
}//比较两种算法的运行速度
void compareTime(Mat& image)
{int count = 10;long begin, end;//统计单循环方式(逐像素)运行时间begin = clock();while (count-- > 0)setAllWhite(image); //运行end = clock();printf("Single loop time is %f .\n", (double)(end - begin) / (double)CLOCKS_PER_SEC);// clock()以ms计,需要除1000才能获取到s//统计双循环方式(逐行)运行时间count = 10;begin = clock();while (count-- > 0)setAllWhiteRows(image); //运行end = clock();printf("Double loop time is %f \n", (double)(end - begin) / (double)CLOCKS_PER_SEC);
}//输出RGB
void Print(Mat& image)
{int i, length;const uchar* p = image.ptr<uchar>(0); //指向首个指针length = image.rows; //*image.cols 这里只输出一行cout << "\nPrint one row pixels:\n";for (i = 0; i < length; i++){printf("%2d", *p++);}cout << endl;
}int main()
{Mat img = imread("Resource/test.png"); //打开图片if (img.empty()){printf("could not load the image..");return -1;}//显示图像namedWindow("初始图像", WINDOW_AUTOSIZE);imshow("初始图像", img);Print(img); //输出RGB//涂色与算法比较compareTime(img); //比较两种算法运行时间//setAllWhite(img); //逐RGB涂色//setAllWhiteRows(img); //逐行涂色//显示图像namedWindow("涂色图像", WINDOW_AUTOSIZE);imshow("涂色图像", img);Print(img); //输出RGBwaitKey(0); //等待
}
OpenCV(一)图像读取与新建、图像显示、操作图像像素(2种涂色并比较算法优劣、输出RGB)相关推荐
- opencv进阶学习笔记2:numpy操作图像,色彩空间,查找指定颜色范围,通道分离与合并
基础部分传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录: python+opencv进阶版学习笔记目录(适合有一定基础) Numpy操作图像 1.遍历图像每一 ...
- ROS下UVC免驱高速摄像头图像读取以及利用image_transport进行图像传递
网上可以买到很多高速摄像头模块,常见的就是这个ov2710模组,采用uvc免驱,号称在1080p 30fps,720p 60fps以及VGA 120fps. 值得是注意的是,这些高速模式都是在MJPG ...
- python 读取图片成为一维数组_python+opencv 图像的数组和矩阵操作
在调用opencv的imread函数读取图像时,我们得到的其实是一个类型为numpy.ndarray的n维数组.这个数组的维度是[height,width,3],它是由每个像素的RGB通道的灰度值组成 ...
- opencv入门基础——图像读取,图像显示,图像保存
一,图像读取 如上图所示,从文件中导入图像用这个函数 retval=cv.imread(文件名,[,显示控制参数]) 显示控制参数,主要是这几个: cv.IMREAD_UNCHANGED cv.IMR ...
- 【opencv系列02】OpenCV4.X图像读取与显示
点击上方"AI搞事情"关注我们 一.读取图片 opencv中采用imread() 函数读取图像 imread(filename, flags=None) filename ...
- youcans 的 OpenCV 学习课—2.图像读取与显示
youcans 的 OpenCV 学习课-2.图像读取与显示 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的读取.保存和显示.除基本方法和例程外,还给出了从 ...
- openCV 图像和视频处理基础操作
openCV 基础操作 A.数据读取-图像 B. 数据读取-视频 C. 截取部分图像数据 D.颜色通道提取 E.边界填充 F.图像融合 G. 图像阈值 H. 图像平滑 openCV 参考相关技术博客和 ...
- OpenCV 【十九】图像金字塔/基本的阈值操作/实现自己的线性滤波器
目录 1.part one 图像金字塔 1.1原理 1.1.1图像金字塔 1.1.2高斯金字塔 1.2代码 1.3运行结果 2.part two 基本的阈值操作¶ 2.1原理 2.1.1阈值化的类型: ...
- OpenCV 1.x 2.x 编程简介(矩阵/图像/视频的基本读写操作)
OpenCV 编程简介(矩阵/图像/视频的基本读写操作) Introduction to programming with OpenCV OpenCV编程简介 作者: Gady Agam Depart ...
最新文章
- 广东海洋大学微型计算机考试,广东海洋大学2007-2008微型计算机原理及应用
- javascript 的参数有长度限制吗?一个细节引起的误区
- simple introduction to AUTOFS
- 【Elasticsearch】你看懂 Elasticsearch Log 中的 GC 日志了吗?
- aptana 代码折行
- ECMAScript5新增Array方法forEach的实现
- php h5视频录制上传,基于koa的h5视频录制异步上传
- 百练 2965 玛雅历 解题报告
- xml建模包括以下_数据挖掘--建模与挖掘的结合
- [Linux源码分析]Linux内核架构
- [VBA]VBA编写的时光倒流软件
- linux从新建命令窗口快捷键,tmux 常用命令及快捷键
- CRM客户细分的价值
- 霹雳猿教程网站正式上线
- labuladong 公众号的使用方法
- 揭秘电信“龙计划”:合约手机将执行“四统一”
- Mac上php环境配置
- Android各种大内存脚本对比(app2sd,a2sd,a2sd+,d2sd,CronMod,Mound2SD)
- 【图像去噪】基于最小二乘方滤波实现图像去噪含Matlab源码
- 一文读懂 druid连接池
热门文章
- 生成器、迭代器的区别?
- kvm虚拟机vnc配置
- Windows平台搭建-----C语言
- HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析
- 02---控制移动底座1
- mysql 5.7 1054_MySQL5.7更改密码时出现ERROR 1054 (42S22)的解决方法
- 算法设计与分析第1章 算法概述
- php 英文小写变大写,PHP英文字母大小写转换函数
- fedora mysql 客户端_fedora mysql 安装
- 方法 注释_注释模板导入操作方法