遇到的問題:
1 持續灰色圖像框
waitkey()要在imshow()之前調用。
2 CvRect 和Rect
CvXXX是C語言的接口,cv::XXX是C++語言的接口。兩者混在一起容易出錯
3 分類器detectMultiScale各個參數的作用
CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1,int minNeighbors, int flag)
這里先將圖像變成灰度圖,對它應用直方圖均衡化,做一些預處理的工作。接下來檢測人臉,調用detectMultiScale函數,該函數在輸入圖像的不同尺度中檢測物體。
1. image為輸入的灰度圖像
2. objects為得到被檢測物體的矩形框向量組
3. scaleFactor為每一個圖像尺度中的尺度參數,默認值為1.1
4. minNeighbors參數為每一個級聯矩形應該保留的鄰近個數(沒能理解這個參數,-_-|||),默認為3
5. flags對於新的分類器沒有用(但目前的haar分類器都是舊版的,CV_HAAR_DO_CANNY_PRUNING利用Canny邊緣檢測器來排除一些邊緣很少或者很多的圖像區域,CV_HAAR_SCALE_IMAGE就是按比例正常檢測,CV_HAAR_FIND_BIGGEST_OBJECT只檢測最大的物,CV_HAAR_DO_ROUGH_SEARCH只做初略檢測。
4 findContours:在二值圖中尋找圖像輪廓,本函數將改變輸入的二值圖(即參數image)內容。
參數說明:
image:二值化圖
contours:檢測出的輪廓,每個輪廓是一組點的向量。(一般有多個輪廓,定義為 vector<vector<Point>> contours)
hierarchy:可選輸出。大概表示輪廓的層次結構,比如某個輪廓的雙親孩子嵌套的輪廓。(具體看文檔)
mode:
CV_RETR_EXTERNAL:只獲取最外層輪廓。hierarchy[i][2]=hierarchy[i][3]=-1(注意:這種情況當圖像邊緣有閉合框時只能檢測到那個最大的閉合框)
CV_RETR_LIST:不建立hierarchy,返回所有輪廓
CV_RETR_CCOMP:建立兩層hierarchy,返回所有輪廓
CV_RETR_TREE:建立嵌套輪廓的完整hierarchy,返回所有輪廓
method:
CV_CHAIN_APPROX_NONE:存儲所有點
CV_CHAIN_APPROX_SIMPLE:儲存壓縮后的點,一般是矩形的四個頂點
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:(沒用過)
offse:可選偏移。每一個輪廓點的偏移量. 當輪廓是從圖像 ROI 中提取出來的時候,使用偏移量有用,因為可以從整個圖像上下文來對輪廓做分析.
5 計算結果本應為0,計算機給出類似於-..e-006的結果
因為 PI 是無窮數,計算機精度有限。對於浮點數,一般當其小於某個值的時候可以認為==0
6 warpAffine:對一個圖像應用旋轉變換
C++:voidwarpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int
flags=INTER_LINEAR, intborderMode=BORDER_CONSTANT, const Scalar&
borderValue=Scalar())
src 輸入圖像 ,可以是1,2,3,4通道
dst 輸出圖像 ,和src是同樣類型和大小
M 2x3的旋轉矩陣
dsize 輸出圖像的大小
flag 插值方法:
INTER_NEAREST:最近鄰插值
INTER_LINEAR:線性插值(默認參數)
INTER_AREA:使用象素關系重采樣。當圖像縮小時候,該方法可以避免波紋出現。當圖像放大時,類似於CV_INTER_NN方法
INTER_CUBIC:4x4立方體雙插值
INTER_LANCZOS4:lanczos 8領域插值
WARP_INVERSE_MAP 表示M是個逆變換(dst-->src)
borderMode:
“BORDER_TRANSPARENT”:對應於源圖像中outliers的目標圖像的像素並沒有被這個函數改變
“BORDER_CONSTANT”
bordervalue:填充顏色
