OpenCV(一)图像读取与新建、图像显示、操作图像像素(2种涂色并比较算法优劣、输出RGB)
生活随笔
收集整理的這篇文章主要介紹了
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构与算法(7-2)图的遍历(深度优
- 下一篇: OpenCV(二)逐像素的图像复制、图像