生活随笔
收集整理的這篇文章主要介紹了
使用opencv作物件识别(一) —— 积分直方图加速HOG特征计算
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用opencv作物件識別(一) —— 積分直方圖加速HOG特征計算
CC++C#?
方向梯度直方圖(Histograms of Oriented Gradients,簡稱HOG特征)結合支持向量機( support vector machine, 簡稱SVM),被廣泛應用于圖像識別中,尤其在行人檢測中獲得了極大的成功。?
積分直方圖可以用于快速計算原始圖像矩形區域內的HOG特征。積分直方圖的概念類似與viola和jones在臉部識別中所用的積分圖像。?
下面的代碼給出了,對于一幅給定的圖像,如何快速計算積分直方圖,以及如何使用其進行HOG特征的演算(關鍵處以給出注釋):?
C代碼??
?? IplImage**?calculateIntegralHOG(IplImage*?in)?? {?? ?????? ????IplImage*?img_gray?=?cvCreateImage(cvGetSize(in),?IPL_DEPTH_8U,1);?? ????cvCvtColor(in,?img_gray,?CV_BGR2GRAY);?? ????cvEqualizeHist(img_gray,img_gray);?? ?? ?? ?? ????IplImage?*xsobel,?*ysobel;?? ????xsobel?=?doSobel(img_gray,?1,?0,?3);?? ????ysobel?=?doSobel(img_gray,?0,?1,?3);?? ????cvReleaseImage(&img_gray);?? ?? ?? ?? ?? ????IplImage**?bins?=?(IplImage**)?malloc(9?*?sizeof(IplImage*));?? ????for?(int?i?=?0;?i?<?9?;?i++)?{?? ????????bins[i]?=?cvCreateImage(cvGetSize(in),?IPL_DEPTH_32F,1);?? ????????cvSetZero(bins);?? ????}?? ?? ?? ?? ?? ????IplImage**?integrals?=?(IplImage**)?malloc(9?*?sizeof(IplImage*));??? ????for?(int?i?=?0;?i?<?9?;?i++)?{?? ????????integrals[i]?=?cvCreateImage(cvSize(in->width?+?1,?in->height?+?1),?? ????????IPL_DEPTH_64F,1);?? ????}?? ?? ?? ?? ????int?x,?y;?? ????float?temp_gradient,?temp_magnitude;?? ????for?(y?=?0;?y?<?in->height;?y++)?{?? ?? ?? ?? ????????float*?ptr1?=?(float*)?(xsobel->imageData?+?y?*?(xsobel->widthStep));?? ????????float*?ptr2?=?(float*)?(ysobel->imageData?+?y?*?(ysobel->widthStep));?? ????????float**?ptrs?=?(float**)?malloc(9?*?sizeof(float*));?? ????????for?(int?i?=?0;?i?<?9?;i++){?? ????????????ptrs[i]?=?(float*)?(bins[i]->imageData?+?y?*?(bins->widthStep));?? ????????}?? ?? ?? ?? ????????for?(x?=?0;?x?<in->width;?x++)?{?? ?? ?? ?? ????????????if?(ptr1[x]?==?0){?? ????????????????temp_gradient?=?((atan(ptr2[x]?/?(ptr1[x]?+?0.00001)))?*?(180/???PI))?+?90;?? ????????????}?? ????????????else{?? ????????????????temp_gradient?=?((atan(ptr2[x]?/?ptr1[x]))?*?(180?/?PI))?+?90;?? ????????????}?? ????????????temp_magnitude?=?sqrt((ptr1[x]?*?ptr1[x])?+?(ptr2[x]?*?ptr2[x]));?? ?? ?? ?? ????????????if?(temp_gradient?<=?20)?{?? ????????????????ptrs[0][x]?=?temp_magnitude;?? ????????????}?? ????????????else?if?(temp_gradient?<=?40)?{?? ????????????????ptrs[1][x]?=?temp_magnitude;?? ????????????}?? ????????????else?if?(temp_gradient?<=?60)?{?? ????????????????ptrs[2][x]?=?temp_magnitude;?? ????????????}?? ????????????else?if?(temp_gradient?<=?80)?{?? ????????????????ptrs[3][x]?=?temp_magnitude;?? ????????????}?? ????????????else?if?(temp_gradient?<=?100)?{?? ????????????????ptrs[4][x]?=?temp_magnitude;?? ????????????}?? ????????????else?if?(temp_gradient?<=?120)?{?? ????????????????ptrs[5][x]?=?temp_magnitude;?? ????????????}?? ????????????else?if?(temp_gradient?<=?140)?{?? ????????????????ptrs[6][x]?=?temp_magnitude;?? ????????????}?? ????????????else?if?(temp_gradient?<=?160)?{?? ????????????????ptrs[7][x]?=?temp_magnitude;?? ????????????}?? ????????????else?{?? ????????????????ptrs[8][x]?=?temp_magnitude;?? ????????????}?? ????????}?? ????}?? ?? ????cvReleaseImage(&xsobel);?? ????cvReleaseImage(&ysobel);?? ?? ?? ?? ????for?(int?i?=?0;?i?<9?;?i++){?? ????????cvIntegral(bins[i],?integrals[i]);?? ????}?? ?? ????for?(int?i?=?0;?i?<9?;?i++){?? ????????cvReleaseImage(&bins[i]);?? ????}?? ?? ?? ?? ????return?(integrals);?? ?? }?? 如何使用上面的函數來計算9維的方向梯度直方圖呢?如下:?
C代碼??
?? ?? void?calculateHOG_rect(CvRect?cell,?CvMat*?hog_cell,?? IplImage**?integrals,?int?normalization)?{?? ?? ?? ?? ????for?(int?i?=?0;?i?<?9?;?i++){?? ?? ????????float?a?=((double*)(integrals[i]->imageData?+?(cell.y)?*?(integrals->?? ????????????widthStep)))[cell.x];?? ?? ????????float?b?=?((double*)?(integrals->imageData?+?(cell.y?+?cell.height)?*??? ????????????(integrals->widthStep)))[cell.x?+?cell.width];?? ?? ????????float?c?=?((double*)?(integrals->imageData?+?(cell.y)?*?(integrals-??? ????????????>widthStep)))[cell.x?+?cell.width];?? ?? ????????float?d?=?((double*)?(integrals->imageData?+?(cell.y?+?cell.height)?*??? ????????????(integrals->widthStep)))[cell.x];?? ?? ????????((float*)?hog_cell->data.fl)?=?(a?+?b)?-?(c?+?d);?? ?? ????}?? ?? ?? ?????? ????if?(normalization?!=?-1){?? ????????cvNormalize(hog_cell,?hog_cell,?1,?0,?normalization);?? ????}?? ?? }??
總結
以上是生活随笔為你收集整理的使用opencv作物件识别(一) —— 积分直方图加速HOG特征计算的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。