??作者介紹:22級樹莓人(計算機專業(yè)),熱愛編程<目前在c++和openCv階段>——目標Windows,MySQL,Qt,數(shù)據(jù)結構與算法,openCv,Linux,多線程,會持續(xù)分享學習成果和小項目的
??作者主頁:熱愛編程的小K
??專欄鏈接:OpenCV??歡迎各位→點贊?? + 收藏?? + 留言???
??總結:希望你看完之后,能對你有所幫助,不足請指正!共同學習交流 ??
一、圖像通道
- 顏色通道
- RGB 圖像有4 個默認通道:紅色、綠色和藍色各有一個通道,以及一個用于編輯圖像復合通道(主通道)
- 彩色深度
8位色,每個像素所能顯示的彩色數(shù)為2的8次方,即256種顏色。
16位增強色,16位彩色,每個像素所能顯示的彩色數(shù)為2的16次方,即65536種顏色。
24位真彩色,每個像素所能顯示的彩色數(shù)為24位,即2的24次方,約1680萬種顏色。
32位真彩色,即在24位真彩色圖像的基礎上再增加一個表示圖像透明度信息的
Alpha
通道。
Alpha
通道:一張圖片的透明和半透明度
CV_8UC3
系列解讀
-
函數(shù)原型
CV_<bit_depth>(S|U|F)C<number_of_channels>
-
bit_depth
:像素點占用空間大小,bit
-
S|U|F
:-
S:signed int
——有符號 -
U:unsigned int
——無符號 -
F:float
——單精度浮點
-
-
number_of_channels
- 1 單通道圖像,即為灰度圖像
- 2 雙通道圖像
- 3 三通道圖像
- 4 帶
Alpha
通道的彩色圖像,四通道圖像
二、讀取圖像
1、Mat結構
大家可以用如下圖的方式查看,需要用到哪個調(diào)用哪個,這里只是簡單的介紹
我們可以看一下庫函數(shù)
class Mat
{
public:
/*
flag:
1.數(shù)字簽名
2.維度
3.通道數(shù)
4.連續(xù)性
*/
int flags;
int dims; //數(shù)據(jù)維數(shù)
int rows,cols; //數(shù)據(jù)行列
uchar *data; //存儲的數(shù)據(jù)
const uchar* datastart; //數(shù)據(jù)開始
const uchar* dataend; //數(shù)據(jù)結束
const uchar* datalimit; //數(shù)據(jù)邊界
//其他成員
//.....
//其他方法
//.....
public: //構造方式
// 默認構造函數(shù) Mat A;
Mat ()
// 常用構造函數(shù) Mat A(10,10,CV_8UC3);
Mat (int rows, int cols, int type)
//Mat A(300, 400, CV_8UC3,Scalar(255,255,255));
Mat (int ndims, const int *sizes, int type, const Scalar &s)
Mat (Size size, int type)
Mat (int rows, int cols, int type, const Scalar &s)
Mat (Size size, int type, const Scalar &s)
Mat (int ndims, const int *sizes, int type)
Mat (const Mat &m)
Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
Mat (Size size, int type, void *data, size_t step=AUTO_STEP)
Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)
Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all())
//Mat D (A, Rect(10, 10, 100, 100) );
Mat (const Mat &m, const Rect &roi)
Mat (const Mat &m, const Range *ranges)
};
2、格式化打印圖像數(shù)據(jù)
函數(shù)原型
Ptr<Formatted> format(InputArray mtx, Formatter::FormatType fmt)
- 第一個參數(shù)是圖像名稱
- 第二個參數(shù)是打印方式
-
FMT_DEFAULT
= 0, -
FMT_MATLAB
= 1, -
FMT_CSV
= 2, -
FMT_PYTHON
= 3, -
FMT_NUMPY
= 4,這也是py的一種打印方式,數(shù)組 -
FMT_C
= 5,C語言方式打印
-
3、訪問或設置像素強度值
函數(shù)原型
Scalar 它將各個通道的值構成一個整體,賦給具有相同通道數(shù)的矩陣元素,通俗點就是一個復合數(shù)據(jù)
scalar(1,2,3);
分別把每一個像素點顏色通道設置為1,2,3,注意這里是BGR
4、imread函數(shù)讀取圖片
Mat imread( const String& filename, int flags = IMREAD_COLOR );
filename
:文件路徑flags
:顯示方式
flags | 解釋 |
---|---|
IMREAD_REDUCED_COLOR_4 = 33 | 3通道BGR彩色圖像,使圖像大小減小1/4 |
IMREAD_REDUCED_GRAYSCALE_8 =64 | 單通道灰度圖像,并將圖像尺寸減小1/8 |
IMREAD_REDUCED_COLOR_8 = 65 | 3通道BGR彩色圖像,使圖像大小減小1/8 |
IMREAD_IGNORE_ORIENTATION = 128 | 不要根據(jù)EXIF的方向標志旋轉(zhuǎn)圖像 |
IMREAD_UNCHANGED = -1 | 按原樣返回加載的圖像(帶有alpha通道,否則會被裁剪) |
IMREAD_GRAYSCALE = 0 | 單通道灰度圖像 |
IMREAD_COLOR = 1 | 3通道BGR彩色圖像 |
IMREAD_ANYDEPTH = 2 | 16位/32位圖像,其他則轉(zhuǎn)換為8位 |
IMREAD_ANYCOLOR = 4 | 圖像以任何可能的顏色格式讀取 |
IMREAD_LOAD_GDAL = 8 | gdal驅(qū)動程序加載映像 |
IMREAD_REDUCED_GRAYSCALE_2 =16 | 單通道灰度圖像,并將圖像大小減小1/2 |
IMREAD_REDUCED_COLOR_2 = 17 | 3通道BGR彩色圖像,使圖像大小減小1/2 |
IMREAD_REDUCED_GRAYSCALE_4 =32 | 單通道灰度圖像,并將圖像尺寸減小1/4 |
三、顯示圖像
imshow()顯示圖片
imshow(const string& str,InputArray mat);
-
str
:窗口名稱 -
mat
:圖像
銷毀窗口
destroyAllWindows()
:銷毀所有窗口destroyWindow(const char* windowName)
:銷毀指定窗口
四、保存圖像
imwrite()函數(shù)保存圖片
函數(shù)原型
bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
filename
:保存的文件名img
:圖像params
:設置圖片質(zhì)量,壓縮率,一般不寫
五、綜合案例講解
1、測試上面的函數(shù)
void testMat()
{
//No.1構造方式
Mat img(10, 10, CV_8UC1);
imshow("1", img);
//No.2 BGR
Mat img2(300, 300, CV_8UC3, Scalar(0, 255, 0));
imshow("2", img2);
//No.3 clone方法拷貝
Mat img3 = img2.clone();
imshow("3", img3);
//No.4
Mat img4;
img3.copyTo(img4);
imshow("4", img4);
//No.5
Mat img5 = imread("mm.jpg", IMREAD_GRAYSCALE);
imshow("5", img5);
//No.6
Mat img6 = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
imshow("6", img6);
}
這里講一下拷貝
Mat img3 = img2.clone(); imshow("3", img3);
Mat img4; img3.copyTo(img4); imshow("4", img4);
-
clone()和copyTo()
:第一個是拷貝調(diào)用者,第二個是拷貝到
下面展示一下效果
2、格式化打印效果
void print()
{
Mat img(10, 10, CV_8UC1);
cout << "C:" << endl;
cout << format(img, Formatter::FMT_C) << endl;
cout << "csv:" << endl;
cout << format(img, Formatter::FMT_CSV) << endl;
cout << "py:" << endl;
cout << format(img, Formatter::FMT_PYTHON) << endl;
}
效果展示
3、保存圖片效果展示
void testSaveimg(const char* filename)
{
Mat img = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
imwrite(filename, img);
}
這時候我們打開項目文件夾,就會發(fā)現(xiàn),多了一個圖片文章來源:http://www.zghlxwxcb.cn/news/detail-414117.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-414117.html
4、綜合代碼
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void testMat()
{
//No.1構造方式
Mat img(10, 10, CV_8UC1);
imshow("1", img);
//No.2 BGR
Mat img2(300, 300, CV_8UC3, Scalar(0, 255, 0));
imshow("2", img2);
//No.3 clone方法拷貝
Mat img3 = img2.clone();
imshow("3", img3);
//No.4
Mat img4;
img3.copyTo(img4);
imshow("4", img4);
//No.5
Mat img5 = imread("mm.jpg", IMREAD_GRAYSCALE);
imshow("5", img5);
//No.6
Mat img6 = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
imshow("6", img6);
}
void print()
{
Mat img(10, 10, CV_8UC1);
cout << "C:" << endl;
cout << format(img, Formatter::FMT_C) << endl;
cout << "csv:" << endl;
cout << format(img, Formatter::FMT_CSV) << endl;
cout << "py:" << endl;
cout << format(img, Formatter::FMT_PYTHON) << endl;
}
void testSaveimg(const char* filename)
{
Mat img = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
imwrite(filename, img);
}
int main()
{
//testMat();
//print();
testSaveimg("love.jpg");
waitKey(0);
destroyAllWindows();
return 0;
}
到了這里,關于加載美女圖片之OpenCV 圖像讀取與顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!