一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

2012年7月24日 隨筆檔案

 年華似水匆匆 2014-01-01

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>
#include <STDLIB.H>

void fn1()
{
 printf("calling fn1*****\n");
}

void fn2()
{
 printf("calling fn2*****\n");
}

int main()
{

 atexit(fn1);
 atexit(fn2);
 printf("calling main *****\n");

 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("input the value of a and b:\n");
 scanf("%d%d",&a,&b);

 printf("before exchange:");
 printf("a=%d\tb=%d\n",a,b);

 a=a+b;
 b=a-b;
 a=a-b;

 printf("after the 1st:");
 printf("a=%d\tb=%d\n",a,b);

 a=a^b;
 b=b^a;
 a=a^b;

 printf("after the 2nd:");
 printf("a=%d\tb=%d\n",a,b);

 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è)或部分輪廓的面積;

226cvArcLength:計(jì)算輪廓周長或曲線長度;

227、cvBoundingRect:計(jì)算點(diǎn)集的最外面矩形邊界(獲取輪廓的外接矩形);

228cvSeqRemove:刪除序列中指定位置的元素(輪廓);

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、CvSVMParamsSVM訓(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)色板
調(diào)色板(Palette)也叫顏色查找表,是指在16色(每個(gè)像素4個(gè)bit,總共有16種顏色)或256色(每個(gè)像素8個(gè)bit,即一個(gè)字節(jié),總共有256種顏色)顯示系統(tǒng)中由圖像中出現(xiàn)最頻繁的16種或256種顏色所組成的查找表。對這些顏色按4位(16色)或8位(256色),即0-15或0-255進(jìn)行編號(hào),每一個(gè)編號(hào)(索引值)代表R,G,B,3個(gè)分量24位的顏色值.使用調(diào)色板的圖像叫做調(diào)色板圖像.對于調(diào)色板圖像而言,它們的像素值并不是顏色值,而是顏色在調(diào)色板查找表中的索引號(hào).

圖像的顏色處理
自然界的顏色可以簡單地分為黑白色(包括灰度級(jí))和彩色兩種.
彩色圖像處理分為3個(gè)主要處理領(lǐng)域,即真彩色,假彩色和偽彩色處理領(lǐng)域.在真彩色處理中,被處理的圖像一般從真彩色傳感器中獲得,例如彩色攝像頭或彩色掃描儀;假彩色處理時(shí)一種盡量接近真彩色的人工彩色處理技術(shù);偽彩色處理時(shí)將彩色分配給某種灰度(強(qiáng)度或強(qiáng)度范圍),以增強(qiáng)辨識(shí)能力.
1.將256色位圖轉(zhuǎn)換為灰度圖
位映像
圖像顯示時(shí)是采用掃描方式,即電子槍每次從左到右掃描一行,為每個(gè)像素著色,然后再從上倒下掃描整個(gè)屏幕,利用人眼的視覺殘留效應(yīng)就可以顯示出一屏完整的圖像.我們常說的屏幕分辨率是1024X768,刷新頻率為85Hz,意思為每行掃描1024個(gè)像素,一共要掃描768行,每秒重復(fù)85次.一般刷新頻率大于80Hz時(shí).人眼感受不到屏幕刷新引起的閃爍,這種顯示器就成為位映像設(shè)備.因而所謂的位映像,實(shí)質(zhì)上就是一個(gè)二維(行和列)的像素矩陣.
位圖:
位圖就是采用位映像方法顯示和存儲(chǔ)的圖像.
256色位圖
自然界的任何顏色都可以通過RGB三原色合成.有的顏色含紅色成分多些,其他成分少些.針對含有紅色成分的多少,可以將顏色分為0至255共256個(gè)等級(jí).0級(jí)表示不含紅色成分,255表示含有100%的紅色成分.同樣,綠色和藍(lán)色也可以分為256個(gè)等級(jí).這樣,R,G,B的各種不同的組合就能表示256X256X256(約1600萬)種顏色.當(dāng)從大約1600萬的顏色中選用最常用的256中顏色給位圖的像素進(jìn)行著色時(shí),就得到256色位圖.因而,256色位圖是一種很具有吸引的彩色位圖.
灰度圖
灰度圖(Grayscale)是數(shù)字圖像處理中的一個(gè)比較簡單但卻非常重要的概念.它只含有亮度信息,不含色彩信息.從YIQ或YUV色彩系統(tǒng)轉(zhuǎn)換公式可以看出,當(dāng)R=G=B時(shí),除了Y值不為0外,I,Q值和U,V值都為0,即只有亮度信息,沒有色彩信息.灰度圖就是這樣一種特殊位圖,他每個(gè)像素的R,G,B分量都相等.通常把R,G,B顏色分量量化為0至255共256個(gè)級(jí)別,0表示最暗(黑),255表示最亮(白).經(jīng)過這樣的量化之后,灰度圖成了一種特殊的256色位圖,其調(diào)色板的每一個(gè)選項(xiàng)的RGB分量都是相同的,即從(0,0,0),(1,1,1)一直到(255,255,255).(0,0,0)是全黑色,(255,255,255)是全白色,中間是灰色.
256色到灰度圖的轉(zhuǎn)換
1.最大值法 是R,G,B的值等于他們中的最大值
即 R=G=B=max(R,G,B)
2.平均值法 求 R,G,B的平均值
即 R=G=B=(R+G+B)/3
3.加權(quán)平均法 對R,G,B三值球加權(quán)平均值
即 R=G=B=(wr * R + wg * G + wb* B)/3
其中,wr,wg,wb分貝為R,G,B的權(quán)值
4.色彩系統(tǒng)變換法 由 RGB與YIQ色彩系統(tǒng)變換公式可知,當(dāng)R=G=B時(shí),即得到相應(yīng)的灰度值為
Y=0.299 * R + 0.587 * G + 0.114 * B
將灰度圖像轉(zhuǎn)換為256色位圖
這種將灰度圖轉(zhuǎn)換為彩色圖像的方法通常稱之為圖像的偽彩色處理.
對灰度圖像進(jìn)行偽彩色變換,只需要指定偽彩色的調(diào)色板替換為原來的調(diào)色板即可.
目前常用的偽彩色的調(diào)色板有以下幾種,紅飽和度編碼,綠飽和度編碼,藍(lán)飽和度編碼,黃飽和度編碼,青色飽和度編碼,紫色飽和度編碼,彩虹編碼,熱金屬編碼

將真彩色圖像轉(zhuǎn)換為256色位圖
真彩色圖像指的是能真實(shí)地反映自然物體本來顏色的圖像.大多數(shù)彩色圖像采集系統(tǒng)都采用24位的真彩色(每個(gè)像素12個(gè)bit)來存儲(chǔ)圖像,以便最大限度地保證圖像信息的完整性.將24位真彩色圖像轉(zhuǎn)化為8位的256色圖像,通常稱為對圖像進(jìn)行減色處理.
將真彩色圖像轉(zhuǎn)化為256色位圖的關(guān)鍵是要生成一個(gè)合適的調(diào)色板,因?yàn)橐@示256色位圖必須使用調(diào)色板.該調(diào)色板是否合適是以用調(diào)色板顯示圖像時(shí)是否能最大限度地反映真彩色圖像的彩色信息為標(biāo)準(zhǔn).由于256色位圖調(diào)色板僅能顯示256種顏色,因此,當(dāng)真彩色圖像轉(zhuǎn)化為256色位圖時(shí),就必須從真彩色所能表現(xiàn)的大約16M中顏色中選取最代表性或出現(xiàn)頻率最高的256中顏色.在前面提到,在這256種調(diào)色板顏色中,有20中顏色是windows預(yù)留的.因此,實(shí)際只需要選出236中顏色.確定了用來填寫調(diào)色板的256中顏色后,其余的顏色就用與選定的256中顏色最相似的顏色來代替,這也是不得已而為之,因?yàn)?56色位圖的表現(xiàn)能力有限.
要想從真彩色圖像所能表現(xiàn)的大約16M中顏色中選取最代表性或者出現(xiàn)頻率最高的256中顏色,目前廣泛的采用的方法主要有以下3種 :
流行色算法(popularity algorithm)
是對彩色圖像中所有顏色出現(xiàn)的次數(shù)所統(tǒng)計(jì)分析,即創(chuàng)建一個(gè)數(shù)組記錄各種顏色和該顏色出現(xiàn)的頻率,然后把出現(xiàn)次數(shù)最多(頻率最大)的236中顏色作為調(diào)色板的顏色.該算法實(shí)現(xiàn)起來比較簡單,但該算法可能丟失一些出現(xiàn)頻率較低但是視覺效果明顯的信息.
中位切分算法(median-cut algorithm)
在RGB彩色空間中,R,G,B三基色對應(yīng)于空間的3個(gè)坐標(biāo)軸,并將每一個(gè)坐標(biāo)軸都量化到0-255.0對應(yīng)全黑,255對應(yīng)全白.這樣就形成了一個(gè)邊長256的彩色立方體.所有可能的顏色都對應(yīng)于立方體上的一個(gè)點(diǎn).將彩色立方體切分成236個(gè)小立方體(每個(gè)小立方體中都包含了相同數(shù)量的圖像中出現(xiàn)的顏色點(diǎn).求出每一哦小立方體的中心點(diǎn),這些中心點(diǎn)所表示的顏色就是最能代表圖像顏色特征的236種顏色).中位切分法被廣泛引用,但該算法設(shè)計(jì)復(fù)雜的排序工作,而且內(nèi)存開銷較大.
八叉樹顏色量化算法
將圖像的R,G,B顏色值分布到層狀的八叉樹中.八叉樹的深度最多為9層,即根節(jié)點(diǎn)層和分別表示8位的R,G,B值的8個(gè)節(jié)點(diǎn)層.較及其不重要的R,G,B值的位(R,G,B右邊的位).因此,為了提高效率和節(jié)省內(nèi)存,通常并不把8位R,G,B分量值都用上.......

2010.03.27
圖像增強(qiáng)
圖像增強(qiáng)的目的:1.人眼看著更舒服;2.適合機(jī)器進(jìn)行分析處理.
空域處理法:
數(shù)字圖像f(x,y)經(jīng)增強(qiáng)處理后,得到一幅新的數(shù)字圖像g(x,y),這種方法就叫做空域處理法.在二維圖像空間進(jìn)行增強(qiáng)處理,主要是在灰度級(jí)上做文章,即利用灰度對比度增強(qiáng)的方法,進(jìn)行灰度級(jí)映射變換.
頻域處理法:
將離散圖像f(x,y)進(jìn)行傅立葉變換F(u,v),在空間頻率進(jìn)行濾波處理后得到新的圖像G(u,v),再經(jīng)過傅立葉逆變換得到圖像g(x,y),這種方法就做頻域法處理.卷積定理是頻域法處理的基礎(chǔ).
一般情況下,用空域法增強(qiáng)圖像是較有效的方法,而頻域法則有可能產(chǎn)生交疊誤差,造成圖像失真.同時(shí),頻域法處理圖像時(shí)占用內(nèi)存多,計(jì)算比較費(fèi)時(shí),因而能用空域法就不采用頻域法.使用頻域法可以進(jìn)行正,逆變換,將乘除運(yùn)算變?yōu)榧訙p運(yùn)算.

灰度變換法:
灰度變換法是一種空間域圖像增強(qiáng)的方法,也是圖像增強(qiáng)中技術(shù)比較簡單的方法.它是將圖像f(x,y)的灰度級(jí)按照一定的映射關(guān)系變換為新圖像g(x,y)的灰度級(jí).通常有線性灰度變換,分段線性變換,非線性灰度變換等方法.當(dāng)圖像由于成像時(shí)曝光不充分或過度,成像設(shè)備的非線性或圖像計(jì)量設(shè)備動(dòng)態(tài)范圍小等因素造成圖像對比度不知,細(xì)節(jié)分辨率不清時(shí),對圖像進(jìn)行灰度線性擴(kuò)展常能顯著改善圖像質(zhì)量.為了突出圖像中感興趣的灰度區(qū)間或圖像中的目標(biāo),相對抑制圖像中不感興趣的灰度區(qū)間,可采用分度線性法.
線性灰度變換:
線性灰度變換的基本思想是把原圖像的灰度值按照固定的比例關(guān)系進(jìn)行放大或縮小.例如:原圖像的像素灰度值的范圍為[20,100],如果我們把所有的灰度值同時(shí)擴(kuò)大兩倍,則得到新圖像的灰度值的范圍是[40,200].
分段線性灰度變換
分段灰度線性變換的基本思想是對原圖像中不同灰度范圍的像素值放大或縮小不同的倍數(shù).一般采用三段線性變換.
非線性灰度變換:
一般采用對數(shù)變換和指數(shù)變換兩種形式.
對數(shù)變換:當(dāng)希望對圖像的低灰度區(qū)有較大的擴(kuò)展而對高灰度區(qū)進(jìn)行壓縮時(shí),一般采用該變換.
指數(shù)變換:這種變換對圖像的高灰度區(qū)有較大的擴(kuò)展.

直方圖均值法:
灰度直方圖簡介:
灰度級(jí)直方圖是一種函數(shù),它表示數(shù)字圖像中每一灰度級(jí)與該灰度級(jí)出現(xiàn)的頻率之間的對應(yīng)關(guān)系.
假設(shè)數(shù)字圖像總的像素為n,某一灰度r的像素的數(shù)目為m,曾m/n就是相對頻率.也就是灰度級(jí)為r的像素出現(xiàn)的頻率.灰度直方圖是由若干根線條組成的圖形,每一根線條代表了某一灰度級(jí)像素在整個(gè)圖像中出現(xiàn)的頻率.
如果能使圖像的直方圖是平直的,即各灰度級(jí)基于相同的出現(xiàn)頻率,那么,由于灰度級(jí)具有均勻的概率分布,腿昂看起來就比較清晰.真正增強(qiáng)方法稱為直方圖均衡法.
方差均衡法:
方差均衡法多用于指紋識(shí)別中.計(jì)算圖像的方差和均值,再根據(jù)期望的均值和方差計(jì)算.
圖像平滑技術(shù):
主要目的是減少由于圖像采樣系統(tǒng)的質(zhì)量因素而產(chǎn)生的噪音.一般情況下,在空域內(nèi)可以用鄰域平均來減少噪音;在頻率內(nèi),郵件噪音頻譜通常在高頻段,因此可以采用各種形式的第通道濾波方法來減少噪音.
圖像平滑一般有兩種方法:一種是加權(quán)平均法,一種是低通濾波法.其中低波濾波法屬于頻域法圖像增強(qiáng)技術(shù).
加權(quán)平均法是取一個(gè)nxn的窗口,并取窗口內(nèi)的n^2個(gè)像素的灰度級(jí)的加權(quán)平均值取代中心像素原來的灰度級(jí).加給每一個(gè)像素的灰度級(jí)的權(quán)值是該像素在灰度級(jí)上接近程度的一種度量.
模板的選取:相等加權(quán),錐形加權(quán),灰度差倒數(shù)加權(quán).

種植濾波法:
中值濾波是一種非線性的濾波技術(shù),與其對應(yīng)的中值濾波器當(dāng)然也就是一種非線性濾波器.中值濾波在一定條件下可以克服線性濾波器如最小均方濾波,均值濾波等帶來的圖像細(xì)節(jié)模糊,而且對抑制圖像中的脈沖干擾和椒鹽噪音特別有效.因?yàn)檫@些噪音在圖像中往往以鼓勵(lì)點(diǎn)的形式出現(xiàn),與之對應(yīng)的像素又比較少,所有采用中值濾波能有效的去除這些噪音,達(dá)到圖像增強(qiáng)的目的.
中值濾波法一般采用一個(gè)含有奇數(shù)個(gè)點(diǎn)的滑動(dòng)窗口,對該窗口內(nèi)的諸像素灰度排序,用其中值代替窗口中心像素原來的灰度值,或者說用局部中值代圖像模糊替局部平均值.

圖像的銳化
圖像模糊的實(shí)質(zhì)是圖像受到平均或積分造成的,因此可對圖像進(jìn)行逆運(yùn)算如做微分運(yùn)算來是圖像清晰化.從頻譜角度來看,圖像模糊的實(shí)質(zhì)是其高頻分量被衰減,因而可以通過高通濾波清晰圖像.值得一提的是,對圖像進(jìn)行銳化處理時(shí),圖像必須具有較高的信噪比,否則銳化處理后,圖像的信噪比反而更低,從而使噪聲的增加比信號(hào)還要多.因此,一般是先去除或減弱噪聲后再進(jìn)行銳化處理.
圖像的銳化方法一般有兩種方法:一種是微分法,一種是高通濾波法.
常用的微分銳化方法主要有兩種,即梯度銳化和拉普拉斯銳化.

低通濾波法:
在二維數(shù)字圖像中,干擾和噪聲經(jīng)傅立葉變換后多反映在高頻分量中.因此,對圖像進(jìn)行傅立葉變換后,在頻域進(jìn)行低通濾波,是低頻分量無損通過,對高頻分量進(jìn)行抑制和衰減,即可達(dá)到圖像增強(qiáng)的目的.
常用的集中低通濾波器:理想低通濾波器,巴特奧斯低通濾波器,指數(shù)低通濾波器,梯度低通濾波器.

高通濾波法:
由于圖像中邊緣與灰度級(jí)的急劇變化都與圖像的高頻分量有關(guān),因而在頻域中用高通濾波器濾波能夠使圖像尖銳化.高通濾波器可以衰減圖像傅立葉變化中的低頻分量,而無損傅立葉變換中的高頻信息.
常用高通濾波器:理想高通濾波器,巴特奧斯高通濾波器,指數(shù)高通濾波器,梯度高通濾波器.

圖像的邊緣檢測:
圖像的邊緣檢測(或叫邊緣增強(qiáng))是使圖像的輪廓更加突出的圖像處理方法.在對圖像進(jìn)行特征提取之前,一般都進(jìn)行邊緣檢測,然后再進(jìn)行二值化處理.邊緣檢測將突出圖像的邊緣,邊緣以外的圖像區(qū)域通常被削弱甚至被完全去掉.處理后邊界的亮度與原圖中邊緣周圍的亮度變化率成正比.

微分算子邊緣檢測:
邊緣的檢測常借助空域微分算子進(jìn)行,通過將其模板與圖像卷積完成.兩個(gè)具有不同灰度值的相鄰區(qū)域之間總會(huì)存在灰度邊緣.這種不連續(xù)的灰度邊緣??衫们髮?dǎo)數(shù)的方法檢測到.一般用一階和二階導(dǎo)數(shù)來檢測邊緣,這是因?yàn)樵谶吘壍貛?dǎo)數(shù)值達(dá),而非邊緣地方導(dǎo)數(shù)值小.
圖像中目標(biāo)的邊緣可通過求導(dǎo)數(shù)來確定.但是數(shù)字圖像是離散的,不能求導(dǎo)數(shù).那該怎么辦?方法很簡單,離散的數(shù)字圖像不能求導(dǎo)數(shù),求差分卻是可以的,那么我們就用求差分來近似求導(dǎo)數(shù).

哈夫變換
哈夫變換方法是利用圖像全局特性直接檢測目標(biāo)輪廓,即可將邊緣像素連接起來組成區(qū)域封閉邊界的一種常用方法.在預(yù)知區(qū)域形狀的條件下,利用哈夫變換可以方便地得到邊界曲線二凈不連續(xù)的邊緣像素點(diǎn)連接起來.哈夫變換的主要優(yōu)點(diǎn)是受噪聲和曲線間斷的影響較小.
梯度算子:梯度對應(yīng)一階導(dǎo)數(shù),因而梯度算子是一階導(dǎo)數(shù)算子.
Roberts邊緣檢測算子:利用局部差分方法尋找邊緣的算子,是一種平方根運(yùn)算.對具有陡峭的低噪聲圖像影響最好.
Sobel邊緣檢測算子:采用兩個(gè)卷積核.對灰度級(jí)漸變和噪聲較多的圖像處理得較好.
Prewitt邊緣檢測算子:采用兩個(gè)卷積核.
梯度算子雖然簡單,但都對噪聲有一定的敏感性.由于噪聲的影響,常需要對梯度算子的結(jié)果進(jìn)一步選取閾值做二值化處理,以區(qū)分真假邊緣點(diǎn).

方向算子:
方向算子也能用來檢測圖像的邊緣.方向算子利用一組模板分別計(jì)算不同方向上的差分值,取其中的最大值作為邊緣強(qiáng)度,而將與之對應(yīng)的方向作為邊緣方向.
平移和差分算子:
平移和差分算子可分為垂直邊緣算子,水平邊緣算子和水平與垂直邊緣算子3中,他們采用不同的卷積核.
該方法的實(shí)現(xiàn)思路是首先將圖像平移一個(gè)像素,然后用原圖像減去平移后的圖像.用相減后的結(jié)果來反映原圖像亮度變化率的大小.如果原圖像某個(gè)區(qū)域中的像素保持不變,相減的結(jié)果當(dāng)然為零,即像素為黑;如果圖像中某個(gè)區(qū)域的像素變化劇烈,相減后的結(jié)果就會(huì)較大,即得到較大的變化率,對應(yīng)的像素很亮.值得注意的是,如果相減后的像素為負(fù)值,則應(yīng)取其絕對值,以保證原圖像像素比平移后圖像像素更亮或更黑時(shí),都能得到有效的增強(qiáng).當(dāng)要檢測垂直邊緣時(shí)使用垂直方向的卷積核,其結(jié)果是先將圖像向左平移一個(gè)像素,再用原圖像減去平移后的圖像;當(dāng)要增強(qiáng)水平邊緣是使用水平方向卷積核,其結(jié)果是先將圖像向左上移一個(gè)像素,再用原圖像減去平移后的圖像;當(dāng)要同時(shí)增強(qiáng)水平和垂直方向的邊緣時(shí),利用水平與垂直方向卷積核,其結(jié)果是先將圖像向左上移一個(gè)像素,再向左平移一個(gè)像素,然后用原圖像減去平移后的圖像.

梯度方向算子:
梯度方向算子增強(qiáng)根據(jù)邊緣檢測方向不同可以有8個(gè)不同的卷積核,分別是北,東北,東,東南,南,西南,西和西北方向.
如果在卷積核方向上存在著正的像素亮度變化率,則輸出圖像上的像素變量.變化率越大,則圖像越亮.由于卷積核中所有卷積系數(shù)至和為0,因此,圖像中基本不變的區(qū)域(空域頻率較低的區(qū)域)的結(jié)果像素值很小,即這些部分經(jīng)處理后將變黑.

Krisch邊緣檢測算子:
Nevitia算子:

拉普拉斯算子:
Laplace邊緣檢測算子是一種二階導(dǎo)數(shù)算子,它具有各向同性的性質(zhì),即其對邊緣的檢測與邊緣的方向無關(guān).而且Laplace算子比前述的算子計(jì)算量要小,因?yàn)樗恍枰粋€(gè)模板,因而不必綜合各個(gè)模板的值,所以比較省事.計(jì)算數(shù)字圖像的拉普拉斯值也是借助各種模板實(shí)現(xiàn).這里對模板的基本要求是對應(yīng)中心像素的系數(shù)應(yīng)是正的,對應(yīng)中心像素臨近的系數(shù)應(yīng)是負(fù)的,且所有系數(shù)的和應(yīng)該是0,這樣就不會(huì)產(chǎn)生灰度偏移.

綜合正交算子:
邊緣的存在是圖像中灰度值不連續(xù)的一般表現(xiàn),按照這個(gè)觀點(diǎn),圖像中的孤立點(diǎn)和直線也可以看成邊緣.直線段可看作是由兩個(gè)相鄰的邊緣組成(相當(dāng)于脈沖邊緣),所以也可以很方便地用特殊設(shè)計(jì)的正交模板來檢測.綜合正交模板就是這樣一個(gè)具有特殊功能的算子.

邊界閉合:
當(dāng)圖像中有噪聲時(shí),用各種邊緣算子檢測到的邊緣像素常常是孤立的或分小段連續(xù)的.也就是說,在檢測得到的邊緣圖中,有些是真正的邊緣像素,有些實(shí)際上是噪聲點(diǎn).
為將圖像中不同的區(qū)域分開,需要將邊緣像素連接起來組成區(qū)域的封閉邊界,既要對檢測到的圖像的邊緣進(jìn)行邊界閉合.邊界閉合的方法分為并行和串行兩種.
要對圖像的邊緣像素點(diǎn)進(jìn)行邊界閉合,前提是這些邊界像素點(diǎn)要有共同點(diǎn),就像兩個(gè)人要想在一起,就要有共同語言一樣.邊緣像素連接的基礎(chǔ)即使他們的梯度之間有一定的相似性.

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) 編輯

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多

    噜噜中文字幕一区二区| 欧美一级黄片欧美精品| 精品国产亚洲av成人一区| 亚洲一区二区精品国产av| 亚洲综合日韩精品欧美综合区| 欧美亚洲国产日韩一区二区| 最新国产欧美精品91| 亚洲国产成人精品一区刚刚| 中文精品人妻一区二区| 色婷婷激情五月天丁香| 国产精品尹人香蕉综合网| 精品推荐久久久国产av| 欧美尤物在线视频91| 精品少妇人妻av免费看| 亚洲一区二区福利在线| 日本不卡一本二本三区| 亚洲欧美日本国产不卡| 欧美大粗爽一区二区三区 | 欧美激情视频一区二区三区| 日韩欧美国产精品自拍| 男女激情视频在线免费观看| 91超精品碰国产在线观看| 亚洲中文字幕高清乱码毛片| 国产中文另类天堂二区| 久久re6热在线视频| 女人精品内射国产99| 狠狠干狠狠操亚洲综合| 色综合久久中文综合网| 国产日韩欧美国产欧美日韩| 国产精品福利一二三区| 日韩精品中文在线观看| 中国美女偷拍福利视频| 丰满少妇被粗大猛烈进出视频| 国产精品成人一区二区在线| 欧美三级精品在线观看| 又色又爽又黄的三级视频| 亚洲一区二区精品国产av| 黄色美女日本的美女日人| 免费精品一区二区三区| 免费黄色一区二区三区| 最近中文字幕高清中文字幕无|