Outline:
1.CV背景介紹
2.OpenCV基礎
3.圖像的基本操作:周遊圖像,ROI選取
4.Python環境搭建
5.機器學習在CV中的應用:KNN與Kmeans
一、什麼是Computer Vision(CV)
計算機視覺的目的:通過寫程式來解釋圖檔。
圖像處理:輸入圖像,輸出圖像
計算機視覺:輸入圖像,輸出圖像的了解。
二、圖像處理庫
圖像處理庫:
OpenCV
CxImage ~= OpenCV1.0
CImg 顯示做的好
FreeImage 大量使用指針讀速度快,讀到圖像的資訊全
HALCON 商用精密測量
項目:
OpenBR 人臉識别項目
EasyPR 識别車牌
(三)OpenCV安裝配置
安裝配置參考淺墨部落格:部落格連結
因為之前學過OpenCV,是以就安裝配置了好多次了,但我一般都是用學校的電腦,筆記本上沒配。本來配置很順手了,這次遇到一個問題:無法打開檔案“opencv_ml249d.lib”。找了半天沒找出配置步驟上出什麼問題,看淺墨部落格找到了解決方法:項目->屬性管理器->Debug|Win32->Microsoft.Cpp.Win32.userDirectories中的屬性頁面->連接配接器->正常裡面的附加庫目錄中加入相應的lib檔案目錄。
還有就是,屬性管理器在圖->其他管理器裡裡,老找不着。。。
可安裝插件ImageWatch:下載下傳連結,能顯示Mat内容,友善調試
(四)圖像處理基礎知識
一、彩色圖像存儲:BGR
二、Mat
1、常用構造函數
2、全零矩陣、全一矩陣、對角線為1矩陣
Mat Z = Mat::zeros(, , CV_8UC1);
cout << "Z=" << Z << endl;
Mat O = Mat::ones(, , CV_32F);
cout << "O=" << O << endl;
Mat E = Mat::eye(, , CV_64F);
cout << "E=" << E << endl;
3、ROI:
1)、感興趣區域的設定
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
Mat pImg = imread("Lena.jpg", );
Rect rect(, , , );//(x,y)=(180,200),w=200,height=200
Mat roi = Mat(pImg, rect);
Mat pImgRect = pImg.clone();//深拷貝
rectangle(pImgRect, rect, Scalar(, , ), );
imshow("original image with rectangle", pImgRect);
imshow("roi", roi);
waitKey();
return ;
}
運作結果
2)、淺拷貝、深拷貝
深拷貝兩種方式:
(1)Mat pImgRect = pImg.clone();
(2)Mat pImgRect = pImg.copyto();
4、像素值的讀寫
1).at(i, j)方式
//灰階圖像
Mat grayim(, , CV_8UC1);
uchar value = grayim.at<uchar>(, );
for (int i = ; i < grayim.rows; i++)
for (int j = ; j < grayim.cols; j++)
grayim.at<uchar>(i, j) = (i + j) % ;
imshow("gray", grayim);
//彩色圖像
Mat colorim(, , CV_8UC3);
for (int i = ; i < colorim.rows; i++)
for (int j = ; j < colorim.cols; j++)
{
Vec3b pixel;
pixel[] = i % ;//B
pixel[] = j % ;//G
pixel[] = ; //R
colorim.at<Vec3b>(i, j) = pixel;
}
imshow("color", colorim);
2)疊代器
//灰階圖像
Mat grayim(, , CV_8UC1);
Mat<uchar>::iterator grayit;
for (grayit = grayim.begin<uchar>(); grayit < grayim.end<uchar>(); grayit++)
*grayit = rand() % ;
imshow("gray", grayim);
//彩色圖像
Mat colorim(, , CV_8UC3);
Mat<Vec3b>::iterator colorit;
for (colorit = colorim.begin<Vec3b>(); colorit < colorim.end<Vec3b>(); colorit++)
{
(*colorit)[] = rand() % ;
(*colorit)[] = rand() % ;
(*colorit)[] = rand() % ;
}
imshow("color", colorim);
3)、指針按行周遊
Mat grayim(, , CV_8UC1,Scalar());
for (int i = ; i < grayim.rows; i++)
{
uchar *p = grayim.ptr<uchar>(i);
for (int j = ; j < grayim.cols; j++)
p[j] = rand() % ;
}
imshow("gray", grayim);
4)、Mat_類
Mat M(, , CV_8UC1);
Mat_<uchar> M1 = (Mat_<uchar>&)M;
for (int i = ; i < M1.rows; i++)
{
uchar *p = M1.ptr(i);
for (int j = ; j < M1.cols; j++)
{
double d1 = (double)((i + j) % );
M1(i, j) = d1;
double d2 = M1(i, j);
}
}
5)、一般有映射關系時使用
查找表(降低灰階級,提高運算速度)
量化公式,降低灰階級
Mat M(, , CV_8UC1);
Mat_<uchar> M1 = (Mat_<uchar>&)M;
for (int i = ; i < M1.rows; i++)
{
uchar *p = M1.ptr(i);
for (int j = ; j < M1.cols; j++)
{
double d1 = (double)((i + j) % );
M1(i, j) = d1;
double d2 = M1(i, j);
}
}
Mat Out;
int divideWith = ;
uchar table[];
for (int i = ; i < ; i++)
table[i] = divideWith*(i / divideWith);
Mat lookUpTable(, , CV_8U);
uchar *p = lookUpTable.data;
for (int i = ; i < ; i++)
p[i] = table[i];
LUT(M, lookUpTable, Out);
imshow("origin", M);
imshow("result", Out);
5、資料擷取與存儲
1)imread
Mat pImg = imread("Lena.jpg", 1);
//flag=0,強制轉換為單通道,flag=1不改變
2)imwrite
8U的可以轉化為圖像 看手冊
直接覆寫
6、video讀寫類
1)讀視訊
//讀視訊
//VideoCapture cap(0); //攝像頭id
VideoCapture cap("video.avi"); //本地視訊
if (!cap.isOpened())
{
cerr << "Can not open a camera or file." << endl;
return;
}
Mat edges;
namedWindow("edges",);
for (;;)
{
Mat frame;
cap >> frame;
if (frame.empty())
break;
imshow("frame", frame);
if (waitKey) >=)
break;
}
waitKey();
2)寫視訊
Size s(, );
VideoWriter writer = VideoWriter("myvideo.avi", CV_FOURCC('M', 'J', 'P', 'G'), , s);
if (!writer.isOpened())
{
cerr << "Can not creat a video." << endl;
return -;
}
Mat frame(s, CV_8UC3);
for (int i = ; i < ; i++)
{
writer << frame;
}
(五)python
涉及到深度學習與機器學習相關的内容,是以要學習一下python
python環境的安裝,建議Anaconda+Ipython(Jupyter )+(PyScripter)(版本2.7比較流行或者3.5都可以)
python教程:基礎教程網站
Anaconda下載下傳:
官網下載下傳
官網下載下傳容易出現下載下傳失敗!真的不要嘗試在官網下載下傳。下了好幾次,動不動就是連結斷開下載下傳失敗的。。
(劃重點)從國内清華大學開源軟體鏡像站進行下載下傳并配置鏡像。連結
推薦一個下載下傳安裝教程
緻Python初學者們 - Anaconda入門使用指南 連結位址
Jupyter notebook 使用教程
(六)機器學習
1、機器學習:要随機地觀測資料,要随機地對觀測資料進行采樣,要學習資料的性質(也叫做特征feature)以及屬性(通常叫做label,它是屬于哪個類别的),然後再來預測新的未知資料的屬性。在機器學習,通常把資料分為兩部分,一部分是訓練集training,一部分是測試集test,兩部分互相獨立。
2、監督式學習(除了資料以外,還有額外的屬性,如feature&label):分類和回歸
分類:輸出是離散的。例:根據各種特征,将一個群體,分成幾種。
回歸:輸出連續的。例:根據年齡體重,預測身高。
監督學習主要是分類,盡量把問題轉化為分類問題。
3、非監督式學習(沒有額外的label):聚類和核密度估計
聚類:K-means算法。
(七)KNN(分類)
Knn的應用背景是:手寫字元識别
最常用的資料庫 http://yann.lecun.com/exdb/mnist/
當求未知項目的類别時,先探測周圍項目是什麼類别。轉換成算法:
第一種實作思路:
用一條線把這兩個區域分開,叫決策邊界,把所有資料一分為二。但是要求資料必須是線性可分的,如果資料複雜的時候,就要做非線性的變換了,把資料映射到多元空間中,讓它成為線性可分的。
第二種思路:
就是Knn算法:參考待測點周圍最近的k個資料的label是什麼,将出現頻率最高的label作為該點的預測結果。
Knn作為一種機器學習的算法也分為兩部分
訓練:把訓練集和标簽全部存儲,比如說給下圖這樣一個訓練圖像,把下圖和它的label(5)存儲,把這些存儲完,它就學習完畢了。
測試:提供測試集,沒有标簽,讓算法猜這是什麼,要指定K的大小。
劣勢:沒有訓練,測試的時候需要把所有訓練集都拿來和測試的資料一一比對,比對就涉及距離問題,測試兩個向量的距離。
優勢:簡單。當資料不是線性的時候,表現比其他分類器好一些。
參數K的選擇一般不大于20。
示例:
//補充
(八)K-means(聚類)
聚類算法
K-means
主要做法:選取一個點,對于一堆資料,把它聚成n類。
示例:我們有一堆資料,指定三個資料,把它們聚成三類。
K1,K2,K3指定之後,找到離它最近的一個資料作為center,進行label,把資料分成三個label,在相同label的資料中求均值,定義均值作為新的中心,進行循環疊代,直到收斂為止,停止條件是中心變化很小或者是所有資料的label已經不變了。
Example:顔色降維