目录
一、读取图像与新建图像
注:如果是添加新图(非读取),必须要新建图像,否则会报错(没有初值)。
总而言之,图像必须有初值,这个初值要么读取获得,要么新建获得。
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); //输出RGB
waitKey(0); //等待
}