atexit()函數(shù)在程序退出時(shí)經(jīng)常需要做一些諸如釋放資源的操作,但程序退出的方式有很多種。因此需要一種與程序退出方式無關(guān)的方法來進(jìn)行程序退出時(shí)的必要處理。atexit()函數(shù)用來注冊程序正常終止時(shí)要被調(diào)用的函數(shù)。 atexit()函數(shù)的參數(shù)是一個(gè)函數(shù)指針,函數(shù)指針指向一個(gè)沒有參數(shù)也沒有返回值的函數(shù)。其原型如下所示: atexit(void(*)(void)); 在一個(gè)程序中做多可以用atexit()函數(shù)注冊32個(gè)處理函數(shù),這些處理函數(shù)的調(diào)用順序與其注冊順序相反,即最先注冊的最后調(diào)用,最后注冊的最先調(diào)用。 如下所示: #include <STDIO.H> void fn1() void fn2() int main() atexit(fn1); return 0; 結(jié)果輸出: calling main ***** calling fn2***** calling fn1*****
posted @ 2012-07-24 22:27 xingma0910 閱讀(34) 評(píng)論(0) 編輯 變量之間交換數(shù)據(jù)(不用第三變量)編程之中卻有諸多美妙之處。 #include <STDIO.H> int main() int a,b; printf("before exchange:"); a=a+b; printf("after the 1st:"); a=a^b; printf("after the 2nd:"); return 0; posted @ 2012-07-24 21:37 xingma0910 閱讀(12) 評(píng)論(0) 編輯 圖像處理和圖像識(shí)別中常用的OpenCV函數(shù) (轉(zhuǎn))1、cvLoadImage:將圖像文件加載至內(nèi)存; 2、cvNamedWindow:在屏幕上創(chuàng)建一個(gè)窗口; 3、cvShowImage:在一個(gè)已創(chuàng)建好的窗口中顯示圖像; 4、cvWaitKey:使程序暫停,等待用戶觸發(fā)一個(gè)按鍵操作; 5、cvReleaseImage:釋放圖像文件所分配的內(nèi)存; 6、cvDestroyWindow:銷毀顯示圖像文件的窗口; 7、cvCreateFileCapture:通過參數(shù)設(shè)置確定要讀入的AVI文件; 8、cvQueryFrame:用來將下一幀視頻文件載入內(nèi)存; 9、cvReleaseCapture:釋放CvCapture結(jié)構(gòu)開辟的內(nèi)存空間; 10、cvCreateTrackbar:創(chuàng)建一個(gè)滾動(dòng)條; 11、cvSetCaptureProperty:設(shè)置CvCapture對象的各種屬性; 12、cvGetCaptureProperty:查詢CvCapture對象的各種屬性; 13、cvGetSize:當(dāng)前圖像結(jié)構(gòu)的大??; 14、cvSmooth:對圖像進(jìn)行平滑處理; 15、cvPyrDown:圖像金字塔,降采樣,圖像縮小為原來四分之一; 16、cvCanny:Canny邊緣檢測; 17、cvCreateCameraCapture:從攝像設(shè)備中讀入數(shù)據(jù); 18、cvCreateVideoWriter:創(chuàng)建一個(gè)寫入設(shè)備以便逐幀將視頻流寫入視頻文件; 19、cvWriteFrame:逐幀將視頻流寫入文件; 20、cvReleaseVideoWriter:釋放CvVideoWriter結(jié)構(gòu)開辟的內(nèi)存空間; 21、CV_MAT_ELEM:從矩陣中得到一個(gè)元素; 22、cvAbs:計(jì)算數(shù)組中所有元素的絕對值; 23、cvAbsDiff:計(jì)算兩個(gè)數(shù)組差值的絕對值; 24、cvAbsDiffS:計(jì)算數(shù)組和標(biāo)量差值的絕對值; 25、cvAdd:兩個(gè)數(shù)組的元素級(jí)的加運(yùn)算; 26、cvAddS:一個(gè)數(shù)組和一個(gè)標(biāo)量的元素級(jí)的相加運(yùn)算; 27、cvAddWeighted:兩個(gè)數(shù)組的元素級(jí)的加權(quán)相加運(yùn)算(alpha運(yùn)算); 28、cvAvg:計(jì)算數(shù)組中所有元素的平均值; 29、cvAvgSdv:計(jì)算數(shù)組中所有元素的絕對值和標(biāo)準(zhǔn)差; 30、cvCalcCovarMatrix:計(jì)算一組n維空間向量的協(xié)方差; 31、cvCmp:對兩個(gè)數(shù)組中的所有元素運(yùn)用設(shè)置的比較操作; 32、cvCmpS:對數(shù)組和標(biāo)量運(yùn)用設(shè)置的比較操作; 33、cvConvertScale:用可選的縮放值轉(zhuǎn)換數(shù)組元素類型; 34、cvCopy:把數(shù)組中的值復(fù)制到另一個(gè)數(shù)組中; 35、cvCountNonZero:計(jì)算數(shù)組中非0值的個(gè)數(shù); 36、cvCrossProduct:計(jì)算兩個(gè)三維向量的向量積(叉積); 37、cvCvtColor:將數(shù)組的通道從一個(gè)顏色空間轉(zhuǎn)換另外一個(gè)顏色空間; 38、cvDet:計(jì)算方陣的行列式; 39、cvDiv:用另外一個(gè)數(shù)組對一個(gè)數(shù)組進(jìn)行元素級(jí)的除法運(yùn)算; 40、cvDotProduct:計(jì)算兩個(gè)向量的點(diǎn)積; 41、cvEigenVV:計(jì)算方陣的特征值和特征向量; 42、cvFlip:圍繞選定軸翻轉(zhuǎn); 43、cvGEMM:矩陣乘法; 44、cvGetCol:從一個(gè)數(shù)組的列中復(fù)制元素; 45、cvGetCols:從數(shù)據(jù)的相鄰的多列中復(fù)制元素; 46、cvGetDiag:復(fù)制數(shù)組中對角線上的所有元素; 47、cvGetDims:返回?cái)?shù)組的維數(shù); 48、cvGetDimSize:返回一個(gè)數(shù)組的所有維的大??; 49、cvGetRow:從一個(gè)數(shù)組的行中復(fù)制元素值; 50、cvGetRows:從一個(gè)數(shù)組的多個(gè)相鄰的行中復(fù)制元素值; 51、cvGetSize:得到二維的數(shù)組的尺寸,以CvSize返回; 52、cvGetSubRect:從一個(gè)數(shù)組的子區(qū)域復(fù)制元素值; 53、cvInRange:檢查一個(gè)數(shù)組的元素是否在另外兩個(gè)數(shù)組中的值的范圍內(nèi); 54、cvInRangeS:檢查一個(gè)數(shù)組的元素的值是否在另外兩個(gè)標(biāo)量的范圍內(nèi); 55、cvInvert:求矩陣的逆; 56、cvMahalonobis:計(jì)算兩個(gè)向量間的馬氏距離; 57、cvMax:在兩個(gè)數(shù)組中進(jìn)行元素級(jí)的取最大值操作; 58、cvMaxS:在一個(gè)數(shù)組和一個(gè)標(biāo)量中進(jìn)行元素級(jí)的取最大值操作; 59、cvMerge:把幾個(gè)單通道圖像合并為一個(gè)多通道圖像; 60、cvMin:在兩個(gè)數(shù)組中進(jìn)行元素級(jí)的取最小值操作; 61、cvMinS:在一個(gè)數(shù)組和一個(gè)標(biāo)量中進(jìn)行元素級(jí)的取最小值操作; 62、cvMinMaxLoc:尋找數(shù)組中的最大最小值; 63、cvMul:計(jì)算兩個(gè)數(shù)組的元素級(jí)的乘積(點(diǎn)乘); 64、cvNot:按位對數(shù)組中的每一個(gè)元素求反; 65、cvNormalize:將數(shù)組中元素進(jìn)行歸一化; 66、cvOr:對兩個(gè)數(shù)組進(jìn)行按位或操作; 67、cvOrs:在數(shù)組與標(biāo)量之間進(jìn)行按位或操作; 68、cvReduce:通過給定的操作符將二維數(shù)組簡為向量; 69、cvRepeat:以平鋪的方式進(jìn)行數(shù)組復(fù)制; 70、cvSet:用給定值初始化數(shù)組; 71、cvSetZero:將數(shù)組中所有元素初始化為0; 72、cvSetIdentity:將數(shù)組中對角線上的元素設(shè)為1,其他置0; 73、cvSolve:求出線性方程組的解; 74、cvSplit:將多通道數(shù)組分割成多個(gè)單通道數(shù)組; 75、cvSub:兩個(gè)數(shù)組元素級(jí)的相減; 76、cvSubS:元素級(jí)的從數(shù)組中減去標(biāo)量; 77、cvSubRS:元素級(jí)的從標(biāo)量中減去數(shù)組; 78、cvSum:對數(shù)組中的所有元素求和; 79、cvSVD:二維矩陣的奇異值分解; 80、cvSVBkSb:奇異值回代計(jì)算; 81、cvTrace:計(jì)算矩陣跡; 82、cvTranspose:矩陣的轉(zhuǎn)置運(yùn)算; 83、cvXor:對兩個(gè)數(shù)組進(jìn)行按位異或操作; 84、cvXorS:在數(shù)組和標(biāo)量之間進(jìn)行按位異或操作; 85、cvZero:將所有數(shù)組中的元素置為0; 86、cvConvertScaleAbs:計(jì)算可選的縮放值的絕對值之后再轉(zhuǎn)換數(shù)組元素的類型; 87、cvNorm:計(jì)算數(shù)組的絕對范數(shù), 絕對差分范數(shù)或者相對差分范數(shù); 88、cvAnd:對兩個(gè)數(shù)組進(jìn)行按位與操作; 89、cvAndS:在數(shù)組和標(biāo)量之間進(jìn)行按位與操作; 90、cvScale:是cvConvertScale的一個(gè)宏,可以用來重新調(diào)整數(shù)組的內(nèi)容,并且可以將參數(shù)從一種數(shù)據(jù)類型轉(zhuǎn)換為另一種; 91、cvT:是函數(shù)cvTranspose的縮寫; 92、cvLine:畫直線; 93、cvRectangle:畫矩形; 94、cvCircle:畫圓; 95、cvEllipse:畫橢圓; 96、cvEllipseBox:使用外接矩形描述橢圓; 97、cvFillPoly、cvFillConvexPoly、cvPolyLine:畫多邊形; 98、cvPutText:在圖像上輸出一些文本; 99、cvInitFont:采用一組參數(shù)配置一些用于屏幕輸出的基本個(gè)特定字體; 100、cvSave:矩陣保存; 101、cvLoad:矩陣讀??; 102、cvOpenFileStorage:為讀/寫打開存儲(chǔ)文件; 103、cvReleaseFileStorage:釋放存儲(chǔ)的數(shù)據(jù); 104、cvStartWriteStruct:開始寫入新的數(shù)據(jù)結(jié)構(gòu); 105、cvEndWriteStruct:結(jié)束寫入數(shù)據(jù)結(jié)構(gòu); 106、cvWriteInt:寫入整數(shù)型; 107、cvWriteReal:寫入浮點(diǎn)型; 108、cvWriteString:寫入字符型; 109、cvWriteComment:寫一個(gè)XML或YAML的注釋字串; 110、cvWrite:寫一個(gè)對象; 111、cvWriteRawData:寫入多個(gè)數(shù)值; 112、cvWriteFileNode:將文件節(jié)點(diǎn)寫入另一個(gè)文件存儲(chǔ)器; 113、cvGetRootFileNode:獲取存儲(chǔ)器最頂層的節(jié)點(diǎn); 114、cvGetFileNodeByName:在映圖或存儲(chǔ)器中找到相應(yīng)節(jié)點(diǎn); 115、cvGetHashedKey:為名稱返回一個(gè)惟一的指針; 116、cvGetFileNode:在映圖或文件存儲(chǔ)器中找到節(jié)點(diǎn); 117、cvGetFileNodeName:返回文件的節(jié)點(diǎn)名; 118、cvReadInt:讀取一個(gè)無名稱的整數(shù)型; 119、cvReadIntByName:讀取一個(gè)有名稱的整數(shù)型; 120、cvReadReal:讀取一個(gè)無名稱的浮點(diǎn)型; 121、cvReadRealByName:讀取一個(gè)有名稱的浮點(diǎn)型; 122、cvReadString:從文件節(jié)點(diǎn)中尋找字符串; 123、cvReadStringByName:找到一個(gè)有名稱的文件節(jié)點(diǎn)并返回它; 124、cvRead:將對象解碼并返回它的指針; 125、cvReadByName:找到對象并解碼; 126、cvReadRawData:讀取多個(gè)數(shù)值; 127、cvStartReadRawData:初始化文件節(jié)點(diǎn)序列的讀??; 128、cvReadRawDataSlice:讀取文件節(jié)點(diǎn)的內(nèi)容; 129、cvGetModuleInfo:檢查IPP庫是否已經(jīng)正常安裝并且檢驗(yàn)運(yùn)行是否正常; 130、cvResizeWindow:用來調(diào)整窗口的大小; 131、cvSaveImage:保存圖像; 132、cvMoveWindow:將窗口移動(dòng)到其左上角為x,y的位置; 133、cvDestroyAllWindow:用來關(guān)閉所有窗口并釋放窗口相關(guān)的內(nèi)存空間; 134、cvGetTrackbarPos:讀取滑動(dòng)條的值; 135、cvSetTrackbarPos:設(shè)置滑動(dòng)條的值; 136、cvGrabFrame:用于快速將視頻幀讀入內(nèi)存; 137、cvRetrieveFrame:對讀入幀做所有必須的處理; 138、cvConvertImage:用于在常用的不同圖像格式之間轉(zhuǎn)換; 139、cvErode:形態(tài)腐蝕; 140、cvDilate:形態(tài)學(xué)膨脹; 141、cvMorphologyEx:更通用的形態(tài)學(xué)函數(shù); 142、cvFloodFill:漫水填充算法,用來進(jìn)一步控制哪些區(qū)域?qū)⒈惶畛漕伾?/SPAN> 143、cvResize:放大或縮小圖像; 144、cvPyrUp:圖像金字塔,將現(xiàn)有的圖像在每個(gè)維度上都放大兩倍; 145、cvPyrSegmentation:利用金字塔實(shí)現(xiàn)圖像分割; 146、cvThreshold:圖像閾值化; 147、cvAcc:可以將8位整數(shù)類型圖像累加為浮點(diǎn)圖像; 148、cvAdaptiveThreshold:圖像自適應(yīng)閾值; 149、cvFilter2D:圖像卷積; 150、cvCopyMakeBorder:將特定的圖像輕微變大,然后以各種方式自動(dòng)填充圖像邊界; 151、cvSobel:圖像邊緣檢測,Sobel算子; 152、cvLaplace:拉普拉斯變換、圖像邊緣檢測; 153、cvHoughLines2:霍夫直線變換; 154、cvHoughCircles:霍夫圓變換; 155、cvRemap:圖像重映射,校正標(biāo)定圖像,圖像插值; 156、cvWarpAffine:稠密仿射變換; 157、cvGetQuadrangleSubPix:仿射變換; 158、cvGetAffineTransform:仿射映射矩陣的計(jì)算; 159、cvCloneImage:將整個(gè)IplImage結(jié)構(gòu)復(fù)制到新的IplImage中; 160、cv2DRotationMatrix:仿射映射矩陣的計(jì)算; 161、cvTransform:稀疏仿射變換; 162、cvWarpPerspective:密集透視變換(單應(yīng)性); 163、cvGetPerspectiveTransform:計(jì)算透視映射矩陣; 164、cvPerspectiveTransform:稀疏透視變換; 165、cvCartToPolar:將數(shù)值從笛卡爾空間到極坐標(biāo)(極性空間)進(jìn)行映射; 166、cvPolarToCart:將數(shù)值從極性空間到笛卡爾空間進(jìn)行映射; 167、cvLogPolar:對數(shù)極坐標(biāo)變換; 168、cvDFT:離散傅里葉變換; 169、cvMulSpectrums:頻譜乘法; 170、cvDCT:離散余弦變換; 171、cvIntegral:計(jì)算積分圖像; 172、cvDistTransform:圖像的距離變換; 173、cvEqualizeHist:直方圖均衡化; 174、cvCreateHist:創(chuàng)建一新直方圖; 175、cvMakeHistHeaderForArray:根據(jù)已給出的數(shù)據(jù)創(chuàng)建直方圖; 176、cvNormalizeHist:歸一化直方圖; 177、cvThreshHist:直方圖閾值函數(shù); 178、cvCalcHist:從圖像中自動(dòng)計(jì)算直方圖; 179、cvCompareHist:用于對比兩個(gè)直方圖的相似度; 180、cvCalcEMD2:陸地移動(dòng)距離(EMD)算法; 181、cvCalcBackProject:反向投影; 182、cvCalcBackProjectPatch:圖塊的方向投影; 183、cvMatchTemplate:模板匹配; 184、cvCreateMemStorage:用于創(chuàng)建一個(gè)內(nèi)存存儲(chǔ)器; 185、cvCreateSeq:創(chuàng)建序列; 186、cvSeqInvert:將序列進(jìn)行逆序操作; 187、cvCvtSeqToArray:復(fù)制序列的全部或部分到一個(gè)連續(xù)內(nèi)存數(shù)組中; 188、cvFindContours:從二值圖像中尋找輪廓; 189、cvDrawContours:繪制輪廓; 190、cvApproxPoly:使用多邊形逼近一個(gè)輪廓; 191、cvContourPerimeter:輪廓長度; 192、cvContoursMoments:計(jì)算輪廓矩; 193、cvMoments:計(jì)算Hu不變矩; 194、cvMatchShapes:使用矩進(jìn)行匹配; 195、cvInitLineIterator:對任意直線上的像素進(jìn)行采樣; 196、cvSampleLine:對直線采樣; 197、cvAbsDiff:幀差; 198、cvWatershed:分水嶺算法; 199、cvInpaint:修補(bǔ)圖像; 200、cvGoodFeaturesToTrack:尋找角點(diǎn); 201、cvFindCornerSubPix:用于發(fā)現(xiàn)亞像素精度的角點(diǎn)位置; 202、cvCalcOpticalFlowLK:實(shí)現(xiàn)非金字塔的Lucas-Kanade稠密光流算法; 203、cvMeanShift:mean-shift跟蹤算法; 204、cvCamShift:camshift跟蹤算法; 205、cvCreateKalman:創(chuàng)建Kalman濾波器; 206、cvCreateConDensation:創(chuàng)建condensation濾波器; 207、cvConvertPointsHomogenious:對齊次坐標(biāo)進(jìn)行轉(zhuǎn)換; 208、cvFindChessboardCorners:定位棋盤角點(diǎn); 209、cvFindHomography:計(jì)算單應(yīng)性矩陣; 210、cvRodrigues2:羅德里格斯變換; 211、cvFitLine:直線擬合算法; 212、cvCalcCovarMatrix:計(jì)算協(xié)方差矩陣; 213、cvInvert:計(jì)算協(xié)方差矩陣的逆矩陣; 214、cvMahalanobis:計(jì)算Mahalanobis距離; 215、cvKMeans2:K均值; 216、cvCloneMat:根據(jù)一個(gè)已有的矩陣創(chuàng)建一個(gè)新矩陣; 217、cvPreCornerDetect:計(jì)算用于角點(diǎn)檢測的特征圖; 218、cvGetImage:CvMat圖像數(shù)據(jù)格式轉(zhuǎn)換成IplImage圖像數(shù)據(jù)格式; 219、cvMatMul:兩矩陣相乘; 220、cvRound:返回和參數(shù)最接近的整數(shù)值; 221、cvFloor:返回不大于參數(shù)的最大整數(shù)值; 222、cvCeil:返回不小于參數(shù)的最小整數(shù)值; 223、cvCreateImage:創(chuàng)建圖像; 224、cvSetMouseCallback:用鼠標(biāo)獲取確定窗口上的矩形; 225、cvContourArea:計(jì)算整個(gè)或部分輪廓的面積; 226、cvArcLength:計(jì)算輪廓周長或曲線長度; 227、cvBoundingRect:計(jì)算點(diǎn)集的最外面矩形邊界(獲取輪廓的外接矩形); 228、cvSeqRemove:刪除序列中指定位置的元素(輪廓); 229、cvRNG:隨機(jī)生成一個(gè)64位隨機(jī)數(shù); 230、cvGetTickCount:返回64位長整數(shù)的時(shí)間數(shù)據(jù); 231、cvGetTickFrequency:返回系統(tǒng)時(shí)鐘頻率; 232、cvRandInt:返回均勻分布32位的隨機(jī)數(shù); 233、cvRandReal: 返回均勻分布0~1之間的隨機(jī)小數(shù); 234、cvInitMatHeader:初始化矩陣頭,不分配存儲(chǔ)空間; 235、cvTermCriteria:迭代算法終止準(zhǔn)則; 236、CvSVMParams:SVM訓(xùn)練參數(shù),該結(jié)構(gòu)需要初始化,并傳遞給CvSVM訓(xùn)練函數(shù); 237、CvSVM::train:訓(xùn)練SVM; 238、CvSVM::predict:預(yù)測一個(gè)新樣本的響應(yīng)值,在分類問題中,這個(gè)函數(shù)返回類別編號(hào),在回歸問題中,返回函數(shù)值; 239、cvSet2D:修改指定的數(shù)組; 240、CvSVM::get_support_vector_count:獲得支持向量的個(gè)數(shù); 241、CvSVM::get_support_vector:獲得對應(yīng)索引編號(hào)的支持向量; 242、CvSVM::save:將SVM訓(xùn)練完的數(shù)據(jù)保存到指定的文件中(save來源于cvStatModel為ML庫的通用類); 243、CvSVM::load:將指定的文件裝載到SVM指定的對象中; 244、cvCreateBGCodeBookModel:codebook方法中,初始化; 245、cvBGCodeBookUpdate:codebook方法中,更新背景模型; 246、cvBGCodeBookClearStale:codebook方法中,清除消極的codebook; 247、cvBGCodeBookDiff:codebook方法中,背景減除; 248、cvReleaseBGCodeBookModel:codebook方法中,釋放資源; posted @ 2012-07-24 16:44 xingma0910 閱讀(540) 評(píng)論(0) 編輯 圖像處理的基本知識(shí)(轉(zhuǎn))調(diào)色板 圖像的顏色處理 將真彩色圖像轉(zhuǎn)換為256色位圖 2010.03.27 灰度變換法: 直方圖均值法: 種植濾波法: 圖像的銳化 低通濾波法: 高通濾波法: 圖像的邊緣檢測: 微分算子邊緣檢測: 哈夫變換 方向算子: 梯度方向算子: Krisch邊緣檢測算子: 拉普拉斯算子: 綜合正交算子: 邊界閉合: posted @ 2012-07-24 16:14 xingma0910 閱讀(563) 評(píng)論(0) 編輯 cvRectangle 用法Rectangle 繪制簡單、指定粗細(xì)或者帶填充的 矩形 void cvRectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 ); img 圖像. pt1 矩形的一個(gè)頂點(diǎn)。 pt2 矩形對角線上的另一個(gè)頂點(diǎn) color 線條顏色 (RGB) 或亮度(灰度圖像 )(grayscale image)。 thickness 組成矩形的線條的粗細(xì)程度。取負(fù)值時(shí)(如 CV_FILLED)函數(shù)繪制填充了色彩的矩形。 line_type 線條的類型。見cvLine的描述 shift 坐標(biāo)點(diǎn)的小數(shù)點(diǎn)位數(shù)。 函數(shù) cvRectangle 通過對角線上的兩個(gè)頂點(diǎn)繪制矩形。 如: cvRectangle( ResImage, cvPoint(x1,y1), cvPoint(x2,y2), CV_RGB(255,250,250), 2, 8, 0 ); 其中(x1,y1)是坐標(biāo)為x1,y1的點(diǎn)。這里要注意,x1對應(yīng)Width,y1代表Height.具體應(yīng)用的時(shí)候不要搞反了。 posted @ 2012-07-24 15:18 xingma0910 閱讀(85) 評(píng)論(0) 編輯 手勢識(shí)別方法綜述(hand detect) 膚色(轉(zhuǎn))看了一天的論文,總結(jié)出手勢識(shí)別的三種方法:1、通過膚色識(shí)別
2、通過haar-like基
3、通過HandUv
說下各個(gè)優(yōu)缺點(diǎn)
1、通過膚色識(shí)別
設(shè)定人的膚色的范圍,監(jiān)測在這個(gè)范圍內(nèi)的 膚色I(xiàn)nRange,然后畫出給定的區(qū)域。
例子:
#include "cv.h" #include "cxcore.h" #include "highgui.h" #include "math.h" #include <iostream> #include <stdio.h> #include <string.h> #include <conio.h> #include <sstream> #include <time.h> using namespace std; int main()
{ int c = 0; CvSeq* a = 0; CvCapture* capture = cvCaptureFromCAM(0);//從對攝像頭的初始化捕獲 if(!cvQueryFrame(capture)) cout<<"Video capture failed, please check the camera."<<endl; else cout<<"Video camera capture status: OK"<<endl; CvSize sz = cvGetSize(cvQueryFrame( capture));//得到攝像頭圖像大小 IplImage* src = cvCreateImage( sz, 8, 3 );//3通道,每個(gè)通道8位 IplImage* hsv_image = cvCreateImage( sz, 8, 3);// IplImage* hsv_mask = cvCreateImage( sz, 8, 1); IplImage* hsv_mask2 = cvCreateImage( sz, 8, 1); IplImage* hsv_edge = cvCreateImage( sz, 8, 1); CvScalar hsv_min = cvScalar(0, 30, 80, 0);//最小像素的RGB值
CvScalar hsv_max = cvScalar(20, 150, 255, 0);//最大像素的RGB值 //CvScalar hsv_min = cvScalar(30, 30, 30, 0);//最小像素的RGB值 //CvScalar hsv_max = cvScalar(200, 200, 200, 0);//最大像素的RGB值 // CvMemStorage* storage = cvCreateMemStorage(0);//分配大小為0的內(nèi)存空間 CvMemStorage* areastorage = cvCreateMemStorage(0); CvMemStorage* minStorage = cvCreateMemStorage(0); CvMemStorage* dftStorage = cvCreateMemStorage(0); CvSeq* contours = NULL; // cvNamedWindow( "src",1); //在屏幕上創(chuàng)建一個(gè)窗口,第一個(gè)參數(shù)為窗口標(biāo)題,第二個(gè)參數(shù)為窗口屬性, //設(shè)置為0(默認(rèn)值),或者CV_WINDOW_AUTOSIZE,設(shè)置為0,則窗口不會(huì)因圖像的大小而改變 //圖像只能在窗口中根據(jù)窗口的大小進(jìn)行拉伸或縮放;設(shè)置為CV_WINDOW_AUTOSIZE時(shí),窗口會(huì)根據(jù)圖像 //的實(shí)際大小進(jìn)行自動(dòng)拉伸或縮放。 //cvNamedWindow( "hsv-msk",1); //cvNamedWindow( "contour",1); ////// IplImage * background=cvLoadImage("c:\\002.jpg");
if (background==0) { cout<<"open background error"<<endl; } else cout<<"open background ok!"<<endl; CvRect rect=cvRect(0,0,background->width,background->height); cvSetImageROI(background,rect); IplImage * src3=cvCreateImage(cvGetSize(background),background->depth,background->nChannels); while( c != 27)//27為ASCII鍵值(ESC),
{ IplImage* bg = cvCreateImage( sz, 8, 3);// cvRectangle( bg, cvPoint(0,0), cvPoint(bg->width,bg->height), CV_RGB( 255, 255, 255), -1, 8, 0 );//畫矩形,參數(shù):Image,兩個(gè)頂點(diǎn)坐標(biāo),線的顏色,線的厚度 bg->origin = 1; for(int b = 0; b< int(bg->width/10); b++)//畫網(wǎng)格 { cvLine( bg, cvPoint(b*20, 0), cvPoint(b*20, bg->height), CV_RGB( 200, 200, 200), 1, 8, 0 );//畫豎線 cvLine( bg, cvPoint(0, b*20), cvPoint(bg->width, b*20), CV_RGB( 200, 200, 200), 1, 8, 0 );//畫橫線 } src = cvQueryFrame( capture);//得到一幀圖像
cvSaveImage("c:\\src.bmp",src);
cvCvtColor(src, hsv_image, CV_BGR2HSV);//色彩空間轉(zhuǎn)換,HSV cvSaveImage("c:\\hsv.bmp",hsv_image);
cvInRangeS (hsv_image, hsv_min, hsv_max, hsv_mask);//檢查數(shù)組元素是否在兩個(gè)數(shù)量之間,輸出新圖像hsv_mask,從3通道到1通道 //hsv_mask的數(shù)據(jù)要么為0,要么為1,在min和max范圍內(nèi)為1,得到ROI區(qū)域,找到在像素RGB范圍內(nèi)的數(shù)據(jù) //cvSmooth( hsv_mask, hsv_mask, CV_MEDIAN, 27, 0, 0, 0 ); cvSaveImage("c:\\mask.bmp",hsv_mask); //cvSmooth( hsv_mask, hsv_mask2, CV_MEDIAN, 27, 0, 0);//圖像平滑,
cvSmooth( hsv_mask, hsv_mask2, CV_MEDIAN, 3, 0, 0, 0 ); //CV_MEDIAN (median blur) - 對圖像進(jìn)行核大小為param1×param1 的中值濾波 (i.e. 鄰域是方的).
cvCanny(hsv_mask2, hsv_edge, 1, 3, 5); //cvCanny(hsv_mask, hsv_edge, 1, 3, 5);//采用 Canny 算法做邊緣檢測 cvFindContours( hsv_mask, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
//對單通道圖像檢索輪廓,返回第一個(gè)輪廓的指針 CvSeq* contours2 = NULL; double result = 0, result2 = 0; while(contours)//得到最大的兩個(gè)感興趣區(qū) { result = fabs( cvContourArea( contours, CV_WHOLE_SEQ ) );//計(jì)算感興趣區(qū)域的像素點(diǎn)數(shù) if ( result > result2) {result2 = result; contours2 = contours;}; contours = contours->h_next; } if ( contours2 )//最大的感興趣區(qū),ROI { //cout << "contours2: " << contours2->total << endl; CvRect rect = cvBoundingRect( contours2, 0 );//返回一個(gè)2d矩形的點(diǎn)集合 cvRectangle( bg, cvPoint(rect.x, rect.y + rect.height), cvPoint(rect.x + rect.width, rect.y), CV_RGB(200, 0, 200), 1, 8, 0 ); //在bg的矩形區(qū)域中畫rect的圖形 //cout << "Ratio: " << rect.width << ", " << rect.height << ", " << (float)rect.width / rect.height << endl; int checkcxt = cvCheckContourConvexity( contours2 );//檢測輸入的輪廓是否是凸的 //cout << checkcxt <<endl; CvSeq* hull = cvConvexHull2( contours2, 0, CV_CLOCKWISE, 0 );//二維凸包 CvSeq* defect = cvConvexityDefects( contours2, hull, dftStorage );//凸包中的缺陷 if( defect->total >=40 ) {cout << " Closed Palm " << endl;} else if( defect->total >=30 && defect->total <40 ) {cout << " Open Palm " << endl;} else{ cout << " Fist " << endl;} cout << "defet: " << defect->total << endl; CvBox2D box = cvMinAreaRect2( contours2, minStorage );//包圍所有點(diǎn)的輪廓的最小矩形
//cout << "box angle: " << (int)box.angle << endl; cvCircle( bg, cvPoint(box.center.x, box.center.y), 3, CV_RGB(200, 0, 200), 2, 8, 0 );//畫圓 cvEllipse( bg, cvPoint(box.center.x, box.center.y), cvSize(box.size.height/2, box.size.width/2), box.angle, 0, 360, CV_RGB(220, 0, 220), 1, 8, 0 );//橢圓 //cout << "Ratio: " << (float)box.size.width/box.size.height <<endl; } //cvShowImage( "hsv-msk", hsv_mask); hsv_mask->origin = 1; //IplImage* contour = cvCreateImage( sz, 8, 3 ); cvDrawContours( bg, contours2, CV_RGB( 0, 200, 0), CV_RGB( 0, 100, 0), 1, 1, 8, cvPoint(0,0));//繪制輪廓的圖像到bg圖像中
cvShowImage( "src", src);
//cvShowImage("src",src3); //contour->origin = 1; cvShowImage( "contour", contour); //cvReleaseImage( &contour); cvNamedWindow("bg",0);
cvShowImage("bg",bg); cvNamedWindow( "ROI",0); cvShowImage("ROI",hsv_mask2); //cvShowImage("ROI",hsv_mask2); cvReleaseImage( &bg); c = cvWaitKey( 100);
} ////// cvReleaseCapture( &capture); cvDestroyAllWindows(); }
缺陷在于不能區(qū)分臉的顏色和手的顏色,而且識(shí)別出來的是全部在這個(gè)范圍內(nèi)的東西,難以滿足要求。 比較有特點(diǎn)的是http://vinjn.spaces./
他提供的是“虛擬鼓”比較有特色,是
原理
1.原始視頻->人臉識(shí)別
2.根據(jù)人臉的顏色分布,找到手 3.去除手和臉以外的區(qū)域 3.1 對手和臉進(jìn)行連通區(qū)域劃分 3.2 對雙手進(jìn)行運(yùn)動(dòng)分析,滿足條件則擊鼓 他的方法從部分上克服了上述缺陷,但是從他提供的視頻可以看出來他穿的一個(gè)長袖的衣服,而且衣服顏色和膚色差距很大,如果是短袖的衣服效果估計(jì)不會(huì)怎么樣了。 posted @ 2012-07-24 11:29 xingma0910 閱讀(256) 評(píng)論(0) 編輯 |
|