opencv頭檔案
常用頭檔案名的解釋
- [core]核心功能模塊
主要包含了opencv基本資料結構,動態資料結構,繪圖函式,陣列操作相關函式,輔助功能與系統函式和宏, - [imgproc]影像處理模塊
主要包換了影像的變換,濾波直方圖相關結構分析,形狀描述 , - [video]視頻模塊
主要運用在呼叫攝像頭時, - [highgui]高層GUI影像互動模塊
主要包換了圖形互動界面,媒體I/O的輸入輸出,視頻資訊的捕捉和提取,影像視頻編碼等, - [math.h]數學函式庫
包含了一些常用的數學公式,如三角函式,反三角函式,乘方,開方,取整等運算, - [iostream]輸入輸出流頭檔案
主要包含了在c++編碼程序中的 cin輸入內容和cout輸出內容, - [vector] “容器”
之所以被認為是一個容器,是因為vector能夠能夠像容器一樣存放各種資料型別,換句話說,能夠存放任意型別的動態陣列,能夠增加和壓縮資料, - [ml] Machine Learning 機器學習模塊
基本上是統計模型和分類演算法,包含如下內容
統計模型 (Statistical Models)
一般貝葉斯分類器 (Normal Bayes Classifier)
K-近鄰(K-Nearest Neighbors)
支持向量機 (Support Vector Machines)
決策樹 (DecisionTrees)
提升(Boosting)
梯度提高樹(Gradient Boosted Trees)
隨機樹 (Random Trees)
超隨機樹 (Extremely randomized trees)
期望最大化 (Expectation Maximization)
神經網(Neural Networks)
加載修改保存圖片
加載圖片 imread
加載一個影像成為mat格式物件
- IMREAD_UNCHANGED (<0) 表示加載原圖,不做任何改變 (忽略alpha通道)
- IMREAD_GRAYSCALE ( 0 ) 表示把原圖作為灰度影像加載進來
- IMREAD_COLOR (>0) 表示把原圖作為RGB影像加載進來
讀一個GRAY像素點的像素值(CV_8UC1)
Scalar intensity = img.at(y, x);
或者 Scalar intensity = img.at(Point(x, y));
讀一個RGB像素點的像素值
Vec3f intensity = img.at(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
顯示影像 namedWindow & imshow
namedWindow(“Window Title”, WINDOW_AUTOSIZE)
- WINDOW_AUTOSIZE 自動根據影像大小顯示視窗大小,不能人為改變視窗大小
- WINDOW_NORMAL,跟QT集成的時候會使用,允許修改視窗大小,
imshow根據視窗名稱顯示影像到指定的視窗上去,第一個引數是視窗名稱,第二引數是Mat物件
修改圖片 cvtColor
把影像從一個彩色空間轉換到另外一個色彩空間
第一引數源影像、第二引數色彩空間轉換之后的影像、第三個引數表示源轉向目標色彩空間
- COLOR_BGR2HLS
- COLOR_BGR2GRAY
例 : cvtColor( image, gray_image, COLOR_BGR2GRAY );
修改像素值
-
灰度影像
img.at(y, x) = 128; -
RGB三通道影像
img.at(y,x)[0]=128; // blue
img.at(y,x)[1]=128; // green
img.at(y,x)[2]=128; // red -
空白影像賦值
img = Scalar(0); -
ROI選擇
Rect r(10, 10, 100, 100);
Mat smallImg = img?;
Vec3b對應三通道的順序是blue、green、red的uchar型別資料,
Vec3f對應三通道的float型別資料
把CV_8UC1轉換到CV32F1實作如下:
src.convertTo(dst, CV_32F);
保存圖片 imwite
只有8位、16位的PNG、JPG、Tiff格式而且是單通道或者三通道的BGR的影像才可以通過這種方式保存
保存PNG格式的時候可以保存透明通道的圖片
可以指定壓縮引數
矩陣的掩膜操作
獲取影像像素指標 CV_Assert
- CV_Assert(myImage.depth() == CV_8U);
Mat.ptr(int i=0) 獲取像素矩陣的指標,索引i表示第幾行,從0開始計行數,
const uchar* current= myImage.ptr(row ); 獲得當前行指標
p(row, col) =current[col] 獲取當前像素點P(row, col)的像素值
像素范圍處理 saturate_cast
saturate_cast(-100),回傳 0,
saturate_cast(288),回傳255
saturate_cast(100),回傳100
這個函式的功能是確保RGB值得范圍在0~255之間
函式呼叫filter2D功能
定義掩膜:Mat kernel = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D( src, dst, src.depth(), kernel );
其中src與dst是Mat型別變數、src.depth表示位圖深度,有32、24、8等,
Mat物件
Mat物件OpenCV2.0之后引進的影像資料結構、自動分配記憶體、不存在記憶體泄漏的問題,是面向物件的資料結構,分了兩個部分,頭部與資料部分
IplImage是從2001年OpenCV發布之后就一直存在,是C語言風格的資料結構,需要開發者自己分配與管理記憶體,對大的程式使用它容易導致記憶體泄漏問題
Mat物件常用方法
void copyTo(Mat mat)
void convertTo(Mat dst, int type)
Mat clone()
int channels()
int depth()
bool empty();
uchar* ptr(i=0)
Mat物件使用
- 部分復制:一般情況下只會復制Mat物件的頭和指標部分,不會復制資料部分
Mat A= imread(imgFilePath);
Mat B(A) // 只復制 - 完全復制:如果想把Mat物件的頭部和資料部分一起復制,可以通過如下兩個API實作
Mat F = A.clone(); 或 Mat G; A.copyTo(G);
輸出影像的記憶體是自動分配的
使用OpenCV的C++介面,不需要考慮記憶體分配問題
賦值操作和拷貝建構式只會復制頭部分
使用clone與copyTo兩個函式實作資料完全復制
-
建構式
Mat M(2,2,CV_8UC3, Scalar(0,0,255))
其中前兩個引數分別表示行(row)跟列(column)、第三個CV_8UC3中的8表示每個通道占8位、U表示無符號、C表示Char型別、3表示通道數目是3,第四個引數是向量表示初始化每個像素值是多少,向量長度對應通道數目一致 -
創建多維陣列 cv::Mat::create
int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC1, Scalar::all(0));
影像變換
調整影像亮度和對比度屬于像素變換-點操作
像素變換 – 點操作
鄰域操作 – 區域
-
Mat new_image = Mat::zeros( image.size(), image.type() ); 創建一張跟原影像大小和型別一致的空白影像、像素值初始化為0
-
saturate_cast(value)確保值大小范圍為0~255之間
-
Mat.at(y,x)[index]=value 給每個像素點每個通道賦值
模糊處理
Smooth/Blur 給影像預處理時候減低噪聲
使用Smooth/Blur操作其背后是數學的卷積計算
通常這些卷積算子計算都是線性操作,所以又叫線性濾波
直方圖
(參考https://blog.csdn.net/qq_38701868/article/details/89215881)
影像直方圖(Image Histogram)是用以表示數字影像中亮度分布的直方圖,標繪了影像中每個亮度值的像素數,這種直方圖中,橫坐標的左側為純黑、較暗的區域,而右側為較亮、純白的區域,
CV 領域常借助影像直方圖來實作影像的二值化,
- dims:統計的特征數目
- bins:每個特征空間子區段的數目
- range:每個特征空間的取值范圍
計算直方圖 calcHist()
void calcHist(
const Mat* images, //輸入的陣列或資料集,需為相同的深度(CV_8U 或 CV_32F)和相同的尺寸
int nimages, //輸入陣列的個數,第一個引數中存放了多少張 “影像”,有幾個原陣列
const int* channels, //需要統計的通道(dim)索引 ,第一個陣列通道從 0 到 images[0].channels() - 1,而第二個陣列通道從 images[0].channels() 計算到 images[0].channels() + images[1].channels() - 1,
InputArray mask, //可選的操作掩碼,用于標記出統計直方圖的陣列元素資料,如果此掩碼不為空,那么它必須為 8 位,并且與 images[i] 有同樣的大小和尺寸,用于標記出統計直方圖的陣列元素資料,
OutputArray hist, //輸出的目標直方圖 ,二維陣列
int dims, //需要計算的直方圖的維數,正數,不大于 CV_MAX_DIMS(在 OpenCV3 中等于 32)
const int* histSize, //存放每個直方圖尺寸的陣列
const float** ranges, //每一維數值的取值范圍
bool uniform = true, //指示直方圖是否均勻的識別符號
bool accumulate = false //累計識別符號,主要是允許多從多個陣列中計算單個直方圖,或者用于在特定的時間更新直 true,直方圖在配置階段不會被清零方圖,
)
尋找最值 minMaxLoc()
void minMaxLoc(
InputArray src, //輸入的單通道陣列
double* minVal, //回傳最小值的指標
double* maxVal = 0, //回傳最大值的指標
Point* minLoc = 0, //回傳最小位置的指標(二維)
Point* maxLoc = 0, //回傳最大位置的指標(二維情況下)
InputArray mask = noArray() //選擇子陣列的可選掩膜
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226626.html
標籤:AI
上一篇:matlab 練手專案,DBSCAN密度聚類,關于DBSCAN的MATLAB實作的一個案例
下一篇:PyTorch 安裝指南
