版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章1A2A3B4B5A6A7A8B9核心特征檢測(cè)算法可歸納為3類(lèi):基礎(chǔ)角點(diǎn)類(lèi):Harris、Shi-Tomasi(無(wú)尺度不變性,適合簡(jiǎn)單場(chǎng)景);高速實(shí)時(shí)類(lèi):FAST(極致速度,適配實(shí)時(shí)系統(tǒng));魯棒不變類(lèi):SIFT、SURF、ORB(具備尺度/旋轉(zhuǎn)不變性,ORB是實(shí)時(shí)場(chǎng)景的首選)。10程序代碼如下:importcv2importnumpyasnpdefinit_sift():"""初始化SIFT特征檢測(cè)器"""try:#創(chuàng)建SIFT實(shí)例,設(shè)置最大特征點(diǎn)數(shù)量sift=cv2.xfeatures2d.SIFT_create(nfeatures=1000,contrastThreshold=0.02)returnsiftexceptAttributeError:print("錯(cuò)誤:未找到SIFT函數(shù)!請(qǐng)安裝opencv-contrib-python(而非opencv-python)")exit()definit_flann_matcher():"""初始化FLANN匹配器(適配SIFT描述子)"""#FLANN參數(shù)配置(KDTree算法,適合SIFT的浮點(diǎn)型描述子)FLANN_INDEX_KDTREE=1index_params=dict(algorithm=FLANN_INDEX_KDTREE,trees=5)search_params=dict(checks=50)#搜索次數(shù),越大精度越高、速度越慢flann=cv2.FlannBasedMatcher(index_params,search_params)returnflanndefget_book_cover_features(sift,cover_path):"""提取書(shū)本封面的SIFT特征"""#讀取封面圖并轉(zhuǎn)為灰度圖cover_img=cv2.imread(cover_path)ifcover_imgisNone:print(f"錯(cuò)誤:無(wú)法讀取封面圖片{cover_path},請(qǐng)檢查路徑!")exit()cover_gray=cv2.cvtColor(cover_img,cv2.COLOR_BGR2GRAY)#提取特征點(diǎn)和描述子kp_cover,des_cover=sift.detectAndCompute(cover_gray,None)ifdes_coverisNoneorlen(des_cover)<10:print("錯(cuò)誤:封面圖提取的特征點(diǎn)過(guò)少,請(qǐng)更換清晰的封面照片!")exit()#獲取封面圖的四頂點(diǎn)坐標(biāo)(用于后續(xù)映射)h,w=cover_img.shape[:2]cover_pts=np.float32([[0,0],[w,0],[w,h],[0,h]]).reshape(-1,1,2)returncover_img,kp_cover,des_cover,cover_ptsdefdetect_book_in_video(sift,flann,cover_kp,cover_des,cover_pts):"""實(shí)時(shí)檢測(cè)攝像頭中的書(shū)本并框選"""#打開(kāi)攝像頭(0為默認(rèn)攝像頭,若無(wú)效可嘗試1)cap=cv2.VideoCapture(0)ifnotcap.isOpened():print("錯(cuò)誤:無(wú)法打開(kāi)攝像頭,請(qǐng)檢查硬件權(quán)限!")exit()print("\n開(kāi)始實(shí)時(shí)檢測(cè)書(shū)本,按'q'鍵退出...")print("提示:請(qǐng)將書(shū)本封面正對(duì)攝像頭,保證光線充足!")whileTrue:#讀取實(shí)時(shí)幀ret,frame=cap.read()ifnotret:print("錯(cuò)誤:無(wú)法讀取攝像頭幀!")break#轉(zhuǎn)為灰度圖,提取實(shí)時(shí)幀的SIFT特征frame_gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)kp_frame,des_frame=sift.detectAndCompute(frame_gray,None)#特征匹配(僅當(dāng)實(shí)時(shí)幀有足夠特征點(diǎn)時(shí)執(zhí)行)ifdes_frameisnotNoneandlen(des_frame)>10:#FLANNK近鄰匹配(k=2,取Top2匹配對(duì))matches=flann.knnMatch(cover_des,des_frame,k=2)#用Lowe's法則篩選優(yōu)質(zhì)匹配對(duì)(距離比<0.75)good_matches=[]form,ninmatches:ifm.distance<0.75*n.distance:good_matches.append(m)#當(dāng)優(yōu)質(zhì)匹配對(duì)足夠時(shí),計(jì)算單應(yīng)性矩陣并繪制框選iflen(good_matches)>15:#提取匹配的特征點(diǎn)坐標(biāo)src_pts=np.float32([cover_kp[m.queryIdx].ptformingood_matches]).reshape(-1,1,2)dst_pts=np.float32([kp_frame[m.trainIdx].ptformingood_matches]).reshape(-1,1,2)#計(jì)算單應(yīng)性矩陣(RANSAC剔除異常值)H,mask=cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,5.0)ifHisnotNone:#將封面四頂點(diǎn)映射到實(shí)時(shí)幀frame_pts=cv2.perspectiveTransform(cover_pts,H)#繪制框選框(紅色,線寬3)frame=cv2.polylines(frame,[32(frame_pts)],True,(0,0,255),3)#顯示匹配對(duì)數(shù)量cv2.putText(frame,f"GoodMatches:{len(good_matches)}",(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)#顯示實(shí)時(shí)幀cv2.imshow("BookDetection(SIFT+FLANN+Homography)",frame)#按q鍵退出ifcv2.waitKey(1)&0xFF==ord('q'):break#釋放資源cap.release()cv2.destroyAllWindows()if__name__=="__main__":#1.初始化SIFT和FLANNsift=init_sift()flann=init_flann_matcher()#2.提取書(shū)本封面特征cover_path="book_cover.jpg"#替換為你的書(shū)本封面圖片路徑cover_img,cover_kp,cover_des,cover_pts=get_book_cover_features(sift,cover_path)#3.實(shí)時(shí)檢測(cè)攝像頭中的書(shū)本detect_book_in_video(sift,flann,cover_kp,cover_des,cover_pts)第八章14個(gè)2A3A4A5顏色或紋理6B7程序代碼如下:importcv2importnumpyasnpimportmatplotlib.pyplotasplt#解決matplotlib中文顯示問(wèn)題plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=Falsedefload_image(img_path):"""加載圖像并檢查有效性"""img=cv2.imread(img_path)ifimgisNone:raiseException(f"無(wú)法讀取圖像{img_path},請(qǐng)檢查文件路徑或文件完整性!")img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#轉(zhuǎn)為RGB用于matplotlib顯示returnimg,img_rgbdefkmeans_segmentation(img,k=2):"""K-Means顏色聚類(lèi)分割(聚為2類(lèi):貓/背景)"""#1.預(yù)處理:將圖像轉(zhuǎn)為像素點(diǎn)矩陣(N×3),float32類(lèi)型pixel_data=img.reshape((-1,3)).astype(np.float32)#2.K-Means參數(shù)設(shè)置criteria=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,10,1.0)flags=cv2.KMEANS_RANDOM_CENTERS#3.執(zhí)行K-Means聚類(lèi)compactness,labels,centers=cv2.kmeans(pixel_data,k,None,criteria,10,flags)#4.重構(gòu)分割圖像(取占比更大的類(lèi)為背景,另一類(lèi)為貓)centers=np.uint8(centers)seg_img=centers[labels.flatten()]seg_img=seg_img.reshape(img.shape)#5.提取貓的區(qū)域(灰度化+二值化+輪廓檢測(cè))gray=cv2.cvtColor(seg_img,cv2.COLOR_BGR2GRAY)ret,binary=cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)#確保貓的區(qū)域?yàn)榘咨ㄈ舯尘盀榘讋t反轉(zhuǎn))ifnp.sum(binary==255)>(binary.size/2):binary=cv2.bitwise_not(binary)#6.輪廓檢測(cè)+框選contours,_=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)ifcontours:max_contour=max(contours,key=cv2.contourArea)#取最大輪廓(貓)x,y,w,h=cv2.boundingRect(max_contour)cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),3)#紅色框returnimg,seg_imgdefwatershed_segmentation(img):"""分水嶺算法分割"""#1.預(yù)處理:灰度化+降噪+二值化gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)blur=cv2.GaussianBlur(gray,(5,5),0)#高斯降噪ret,binary=cv2.threshold(blur,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)#2.形態(tài)學(xué)操作:去除小噪點(diǎn)kernel=np.ones((3,3),np.uint8)opening=cv2.morphologyEx(binary,cv2.MORPH_OPEN,kernel,iterations=2)#3.距離變換+獲取種子點(diǎn)dist_transform=cv2.distanceTransform(opening,cv2.DIST_L2,5)ret,seeds=cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)seeds=np.uint8(seeds)#4.標(biāo)記未知區(qū)域unknown=cv2.subtract(cv2.dilate(opening,kernel),seeds)#5.生成markers(必須int32類(lèi)型)ret,markers=cv2.connectedComponents(seeds)markers=markers+1markers[unknown==255]=0#6.執(zhí)行分水嶺變換markers=cv2.watershed(img,markers)#7.標(biāo)記邊界+框選img[markers==-1]=[0,0,255]#邊界標(biāo)紅#輪廓檢測(cè)框選contours,_=cv2.findContours((markers==2).astype(np.uint8),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)ifcontours:max_contour=max(contours,key=cv2.contourArea)x,y,w,h=cv2.boundingRect(max_contour)cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)#綠色框returnimg,markersdefgrabcut_segmentation(img):"""GrabCut算法分割(交互式框選,這里預(yù)設(shè)框選區(qū)域)"""#1.初始化掩碼和GMM模型mask=np.zeros(img.shape[:2],np.uint8)bgdModel=np.zeros((1,65),np.float64)fgdModel=np.zeros((1,65),np.float64)#2.預(yù)設(shè)框選區(qū)域(若需手動(dòng)交互,可改為鼠標(biāo)繪制,這里簡(jiǎn)化為中心區(qū)域)h,w=img.shape[:2]rect=(int(w*0.1),int(h*0.1),int(w*0.8),int(h*0.8))#框選大部分區(qū)域#3.執(zhí)行GrabCutcv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)#4.解析分割結(jié)果(保留確定前景+可能前景)mask_result=np.where((mask==2)|(mask==0),0,1).astype(np.uint8)seg_img=img*mask_result[:,:,np.newaxis]#5.輪廓檢測(cè)+框選gray=cv2.cvtColor(seg_img,cv2.COLOR_BGR2GRAY)contours,_=cv2.findContours(gray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)ifcontours:max_contour=max(contours,key=cv2.contourArea)x,y,w,h=cv2.boundingRect(max_contour)cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),3)#藍(lán)色框returnimg,seg_imgdefmain():#1.加載圖像img_path="cat.jpg"img_original,img_rgb=load_image(img_path)#2.分別執(zhí)行三種算法分割#K-Means分割img_kmeans=img_original.copy()img_kmeans_seg,_=kmeans_segmentation(img_kmeans)img_kmeans_rgb=cv2.cvtColor(img_kmeans_seg,cv2.COLOR_BGR2RGB)#分水嶺分割img_watershed=img_original.copy()img_watershed_seg,_=watershed_segmentation(img_watershed)img_watershed_rgb=cv2.cvtColor(img_watershed_seg,cv2.COLOR_BGR2RGB)#GrabCut分割img_grabcut=img_original.copy()img_grabcut_seg,_=grabcut_segmentation(img_grabcut)img_grabcut_rgb=cv2.cvtColor(img_grabcut_seg,cv2.COLOR_BGR2RGB)#3.可視化結(jié)果plt.figure(figsize=(18,6))plt.subplot(131)plt.imshow(img_kmeans_rgb)plt.title("K-Means分割(紅色框)",fontsize=12)plt.axis('off')plt.subplot(132)plt.imshow(img_watershed_rgb)plt.title("分水嶺分割(綠色框)",fontsize=12)plt.axis('off')plt.subplot(133)plt.imshow(img_grabcut_rgb)plt.title("GrabCut分割(藍(lán)色框)",fontsize=12)plt.axis('off')plt.tight_layout()plt.savefig("cat_segmentation_result.jpg",dpi=300,bbox_inches='tight')plt.show()print("分割完成!結(jié)果已保存為cat_segmentation_result.jpg")if__name__=="__main__":try:main()exceptExceptionase:print(f"程序執(zhí)行出錯(cuò):{e}")####1.K-Means分割-核心邏輯:將圖像像素的RGB值作為特征,聚為2類(lèi)(貓/背景),通過(guò)顏色聚類(lèi)區(qū)分目標(biāo);-后處理:聚類(lèi)后二值化,找到最大輪廓(貓),繪制紅色框選框;-優(yōu)勢(shì):無(wú)需交互,速度快;劣勢(shì):對(duì)顏色相近的背景分割效果差。####2.分水嶺分割-核心邏輯:先通過(guò)形態(tài)學(xué)操作去除噪點(diǎn),距離變換生成可靠種子點(diǎn),再執(zhí)行分水嶺變換;-后處理:標(biāo)記分水嶺邊界(紅色),找到貓的輪廓繪制綠色框選框;-優(yōu)勢(shì):邊界分割精準(zhǔn);劣勢(shì):對(duì)噪聲敏感,需復(fù)雜預(yù)處理。####3.GrabCut分割-核心邏輯:預(yù)設(shè)矩形框選貓的區(qū)域(模擬用戶(hù)交互),利用顏色/紋理+邊界信息迭代優(yōu)化分割;-后處理:提取前景區(qū)域輪廓,繪制藍(lán)色框選框;-優(yōu)勢(shì):分割效果最好,僅需少量交互;劣勢(shì):依賴(lài)初始框選的準(zhǔn)確性。第九章1梯度2分類(lèi)和回歸3A4局部5C6A7A8A9程序代碼如下:importcv2importnumpyasnpimportosimportrandom#======================1.配置參數(shù)======================#HOG特征參數(shù)(適配鹿的體型,可根據(jù)圖像尺寸調(diào)整)HOG_WIN_SIZE=(64,128)#檢測(cè)窗口尺寸HOG_BLOCK_SIZE=(16,16)#塊尺寸HOG_BLOCK_STRIDE=(8,8)#塊步長(zhǎng)HOG_CELL_SIZE=(8,8)#單元格尺寸HOG_NBINS=9#梯度方向bin數(shù)#數(shù)據(jù)集路徑(替換為你的實(shí)際路徑)TRAIN_DEER_PATH="deer_dataset/train/deer"TRAIN_NON_DEER_PATH="deer_dataset/train/non_deer"TEST_IMAGE_PATH="deer_dataset/test"#訓(xùn)練參數(shù)SVM_C=1.0#SVM懲罰系數(shù)RANDOM_SEED=0#隨機(jī)種子(保證結(jié)果可復(fù)現(xiàn))#======================2.工具函數(shù)======================defload_and_preprocess_image(img_path,target_size):"""加載圖像并預(yù)處理(灰度化+resize)"""img=cv2.imread(img_path)ifimgisNone:returnNonegray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)resized=cv2.resize(gray,target_size)returnresizeddefextract_hog_features(img,hog):"""提取單張圖像的HOG特征"""features=pute(img)returnfeatures.flatten()#轉(zhuǎn)為一維向量defload_dataset(deer_path,non_deer_path,hog):"""加載訓(xùn)練集并提取HOG特征"""#初始化特征和標(biāo)簽features=[]labels=[]#加載鹿的圖像(標(biāo)簽=1)deer_files=[fforfinos.listdir(deer_path)iff.endswith(('.jpg','.png','.jpeg'))]forfindeer_files:img_path=os.path.join(deer_path,f)img=load_and_preprocess_image(img_path,HOG_WIN_SIZE)ifimgisNone:continuehog_feat=extract_hog_features(img,hog)features.append(hog_feat)labels.append(1)#加載非鹿的圖像(標(biāo)簽=0)non_deer_files=[fforfinos.listdir(non_deer_path)iff.endswith(('.jpg','.png','.jpeg'))]forfinnon_deer_files:img_path=os.path.join(non_deer_path,f)img=load_and_preprocess_image(img_path,HOG_WIN_SIZE)ifimgisNone:continuehog_feat=extract_hog_features(img,hog)features.append(hog_feat)labels.append(0)#轉(zhuǎn)換為OpenCVSVM所需的格式features=np.array(features,dtype=np.float32)labels=np.array(labels,dtype=32)#打亂數(shù)據(jù)集np.random.seed(RANDOM_SEED)shuffle_idx=np.random.permutation(len(features))features=features[shuffle_idx]labels=labels[shuffle_idx]print(f"數(shù)據(jù)集加載完成!總樣本數(shù):{len(features)}|鹿樣本數(shù):{sum(labels)}|非鹿樣本數(shù):{len(labels)-sum(labels)}")returnfeatures,labelsdeftrain_svm(features,labels):"""訓(xùn)練SVM分類(lèi)器"""#創(chuàng)建SVM實(shí)例svm=cv2.ml.SVM.create()#配置SVM參數(shù)svm.setKernel(cv2.ml.SVM_LINEAR)#線性?xún)?nèi)核(HOG特征高維,線性核效果好)svm.setType(cv2.ml.SVM_C_SVC)#二分類(lèi)svm.setC(SVM_C)#懲罰系數(shù)#訓(xùn)練模型svm.train(features,cv2.ml.ROW_SAMPLE,labels)#保存模型(可選)svm.save("deer_svm_model.xml")print("SVM模型訓(xùn)練完成!已保存為deer_svm_model.xml")returnsvmdefconvert_svm_to_hog_detector(svm):"""將訓(xùn)練好的SVM轉(zhuǎn)換為HOG檢測(cè)器所需的格式"""#獲取SVM支持向量和決策函數(shù)sv=svm.getSupportVectors()rho,_,_=svm.getDecisionFunction(0)#構(gòu)造HOG檢測(cè)器的系數(shù)svm_detector=np.append(sv,[[-rho]],axis=0)returnsvm_detectordefdetect_deer_in_image(hog,test_img_path):"""在單張圖像中檢測(cè)鹿"""#讀取測(cè)試圖像img=cv2.imread(test_img_path)ifimgisNone:print(f"無(wú)法讀取測(cè)試圖像:{test_img_path}")return#多尺度檢測(cè)rects,weights=hog.detectMultiScale(img,winStride=(8,8),padding=(16,16),scale=1.05)#NMS非極大值抑制(消除重復(fù)框)iflen(rects)>0:indices=cv2.dnn.NMSBoxes([list(rect[:4])forrectinrects],weights[:,0].tolist(),score_threshold=0.5,nms_threshold=0.3)#繪制檢測(cè)框foriinindices:i=i[0]ifisinstance(i,(list,np.ndarray))elseix,y,w,h=rects[i]cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)cv2.putText(img,f"Deer(conf:{weights[i][0]:.2f})",(x,y-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),1)#顯示并保存結(jié)果cv2.imshow("DeerDetectionResult",img)cv2.imwrite(f"detect_result_{os.path.basename(test_img_path)}",img)cv2.waitKey(0)cv2.destroyAllWindows()#======================主流程======================if__name__=="__main__":#1.初始化HOG特征提取器hog=cv2.HOGDescriptor(HOG_WIN_SIZE,HOG_BLOCK_SIZE,HOG_BLOCK_STRIDE,HOG_CELL_SIZE,HOG_NBINS)print("HOG特征提取器初始化完成!")#2.加載數(shù)據(jù)集并提取HOG特征features,labels=load_dataset(TRAIN_DEER_PATH,TRAIN_NON_DEER_PATH,hog)#3.訓(xùn)練SVM模型svm=train_svm(features,labels)#4.將SVM轉(zhuǎn)換為HOG檢測(cè)器svm_detector=convert_svm_to_hog_detector(svm)hog.setSVMDetector(svm_detector)print("SVM模型已綁定到HOG檢測(cè)器!")#5.檢測(cè)測(cè)試圖像中的鹿test_img_files=[fforfinos.listdir(TEST_IMAGE_PATH)iff.endswith(('.jpg','.png','.jpeg'))]fortest_fileintest_img_files:test_img_path=os.path.join(TEST_IMAGE_PATH,test_file)print(f"\n檢測(cè)圖像:{test_img_path}")detect_deer_in_image(hog,test_img_path)print("\n所有測(cè)試圖像檢測(cè)完成!結(jié)果已保存到當(dāng)前目錄。")第十章1二值化歸一化/閾值化2局部二值局部3LBP的二進(jìn)制組合:10000010鄰域位置左上上右上右右下下左下左灰度值73231581二進(jìn)制標(biāo)記10000010對(duì)比規(guī)則:鄰域像素灰度值≥6→標(biāo)記為1鄰域像素灰度值<6→標(biāo)記為04D5程序代碼如下:importcv2importnumpyasnpimporttime#======================1.配置參數(shù)======================#視頻路徑(0=攝像頭,替換為'person_video.mp4'則讀取本地視頻)VIDEO_PATH=0#優(yōu)先用攝像頭實(shí)時(shí)測(cè)試,更直觀#后處理參數(shù)(降噪+輪廓檢測(cè))KERNEL=np.ones((5,5),np.uint8)#形態(tài)學(xué)操作核MIN_CONTOUR_AREA=500#最小輪廓面積(過(guò)濾小噪點(diǎn))#顏色配置(區(qū)分不同算法的標(biāo)記)COLOR_MOG2=(0,255,0)#綠色:MOG2COLOR_KNN=(255,0,0)#藍(lán)色:KNNCOLOR_CNT=(0,0,255)#紅色:CNT#======================2.初始化背景分割器======================definit_background_subtractors():"""初始化3種背景分割算法"""#MOG2:高斯混合模型,支持陰影檢測(cè)mog2=cv2.createBackgroundSubtractorMOG2(history=500,#歷史幀數(shù)量varThreshold=16,#方差閾值(越大越抗光照變化)detectShadows=True#檢測(cè)陰影(陰影標(biāo)記為127))#KNN:K近鄰背景分割knn=cv2.createBackgroundSubtractorKNN(history=500,dist2Threshold=400,#距離閾值(越大前景越少)detectShadows=True)#CNT:輕量級(jí)實(shí)時(shí)背景分割(速度最快)cnt=cv2.createBackgroundSubtractorCNT(minPixelStability=15,#像素穩(wěn)定幀數(shù)(越小適應(yīng)越快)useHistory=True,#使用歷史背景maxPixelStability=15*60,#最大穩(wěn)定幀數(shù)isParallel=True#并行計(jì)算(加速))returnmog2,knn,cnt#======================3.前景掩碼后處理======================defprocess_mask(mask):"""對(duì)前景掩碼降噪,提取人物輪廓"""#1.去除陰影(僅保留純前景,值=255)mask=np.where(mask==255,255,0).astype(np.uint8)#2.形態(tài)學(xué)操作:先開(kāi)運(yùn)算(去噪點(diǎn)),再閉運(yùn)算(補(bǔ)孔洞)mask=cv2.morphologyEx(mask,cv2.MORPH_OPEN,KERNEL)mask=cv2.morphologyEx(mask,cv2.MORPH_CLOSE,KERNEL)#3.輪廓檢測(cè)(提取人物輪廓)contours,_=cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)returnmask,contours#======================4.繪制人物標(biāo)記======================defdraw_person_mark(frame,contours,color,algo_name):"""在幀上繪制人物輪廓/檢測(cè)框,并標(biāo)注算法名稱(chēng)"""frame_copy=frame.copy()#遍歷輪廓,標(biāo)記面積大于閾值的區(qū)域(人物)forcntincontours:ifcv2.contourArea(cnt)>MIN_CONTOUR_AREA:#繪制輪廓cv2.drawContours(frame_copy,[cnt],-1,color,2)#繪制外接矩形(檢測(cè)框)x,y,w,h=cv2.boundingRect(cnt)cv2.rectangle(frame_copy,(x,y),(x+w,y+h),color,2)#標(biāo)注算法名稱(chēng)cv2.putText(frame_copy,algo_name,(10,30),cv2.FONT_HERSHEY_SIMPLEX,1,color,2)returnframe_copy#======================5.主流程:多算法對(duì)比======================defmain():#初始化背景分割器mog2,knn,cnt=init_background_subtractors()#讀取視頻/攝像頭cap=cv2.VideoCapture(VIDEO_PATH)ifnotcap.isOpened():raiseException("無(wú)法打開(kāi)視頻/攝像頭,請(qǐng)檢查路徑或設(shè)備!")#獲取視頻參數(shù)(用于保存結(jié)果)fps=int(cap.get(cv2.CAP_PROP_FPS))width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))#保存結(jié)果視頻(可選)fourcc=cv2.VideoWriter_fourcc(*'mp4v')out=cv2.VideoWriter('background_subtraction_compare.mp4',fourcc,fps,(width*2,height*2))#性能統(tǒng)計(jì)algo_times={'mog2':[],'knn':[],'cnt':[]}print("開(kāi)始檢測(cè)!按'q'退出,按's'保存當(dāng)前幀對(duì)比圖")whilecap.isOpened():ret,frame=cap.read()ifnotret:break#記錄各算法耗時(shí)start_time=time.time()#==========MOG2分割==========mog2_mask=mog2.apply(frame)mog2_mask_processed,mog2_contours=process_mask(mog2_mask)mog2_frame=draw_person_mark(frame,mog2_contours,COLOR_MOG2,"MOG2")algo_times['mog2'].append(time.time()-start_time)#==========KNN分割==========start_time=time.time()knn_mask=knn.apply(frame)knn_mask_processed,knn_contours=process_mask(knn_mask)knn_frame=draw_person_mark(frame,knn_contours,COLOR_KNN,"KNN")algo_times['knn'].append(time.time()-start_time)#==========CNT分割==========start_time=time.time()cnt_mask=cnt.apply(frame)cnt_mask_processed,cnt_contours=process_mask(cnt_mask)cnt_frame=draw_person_mark(frame,cnt_contours,COLOR_CNT,"CNT")algo_times['cnt'].append(time.time()-start_time)#==========拼接顯示窗口==========#上半部分:原始幀+MOG2結(jié)果row1=np.hstack((frame,mog2_frame))#下半部分:KNN結(jié)果+CNT結(jié)果row2=np.hstack((knn_frame,cnt_frame))#合并為2x2網(wǎng)格show_frame=np.vstack((row1,row2))#縮放窗口(適配屏幕)show_frame=cv2.resize(show_frame,(1280,720))#顯示cv2.imshow("背景分割算法對(duì)比(MOG2=綠|KNN=藍(lán)|CNT=紅)",show_frame)#寫(xiě)入結(jié)果視頻out.write(cv2.resize(np.vstack((row1,row2)),(width*2,height*2)))#按鍵操作key=cv2.waitKey(1)&0xFFifkey==ord('q'):breakelifkey==ord('s'):cv2.imwrite("background_subtraction_compare.jpg",show_frame)print("當(dāng)前幀對(duì)比圖已保存!")#==========性能統(tǒng)計(jì)與分析==========print("\n==========算法性能統(tǒng)計(jì)==========")foralgo,timesinalgo_times.items():avg_time=np.mean(times)*1000#轉(zhuǎn)毫秒print(f"{algo.upper()}平均單幀耗時(shí):{avg_time:.2f}ms")#釋放資源cap.release()out.release()cv2.destroyAllWindows()#======================運(yùn)行主程序======================if__name__=="__main__":try:main()exceptExceptionase:print(f"程序出錯(cuò):{e}")結(jié)論:對(duì)人像視頻分割,MOG2算法的精度最優(yōu),KNN適合動(dòng)態(tài)背景,CNT適合實(shí)時(shí)場(chǎng)景;6色調(diào)(Hue)、飽和度(Saturation)、明度(Value)7A8瞬時(shí)速度9運(yùn)動(dòng)速度矢量10變化相關(guān)性11特征點(diǎn)圖像上的所有像素點(diǎn)12D13上升梯度方向逐步迭代偏移至密度梯度值近似為014HSV(或Hue/色調(diào))MeanShift(均值漂移)中心(或?qū)崟r(shí))15B第十一章1神經(jīng)元模型是一個(gè)包含輸入、加權(quán)求和與激活(非線性映射)功能的模型。2一個(gè)經(jīng)典的神經(jīng)網(wǎng)絡(luò)包含3個(gè)層次,分別為輸入層、隱藏層、輸出層。3分類(lèi)問(wèn)題中過(guò)擬合現(xiàn)象的消除方法有增大訓(xùn)練數(shù)據(jù)集、正則化(L1/L2正則)、早停(EarlyStopping)、Dropout隨機(jī)失活。4分類(lèi)問(wèn)題中欠擬合現(xiàn)象的消除方法有增加模型復(fù)雜度、延長(zhǎng)訓(xùn)練時(shí)間、特征工程(擴(kuò)充有效特征)。對(duì)比維度監(jiān)督學(xué)習(xí)無(wú)監(jiān)督學(xué)習(xí)半監(jiān)督學(xué)習(xí)強(qiáng)化學(xué)習(xí)數(shù)據(jù)標(biāo)簽全量輸入-輸出標(biāo)簽對(duì)無(wú)標(biāo)簽少量標(biāo)簽+大量無(wú)標(biāo)簽無(wú)標(biāo)簽,靠環(huán)境獎(jiǎng)勵(lì)反饋學(xué)習(xí)目標(biāo)輸入→輸出的映射關(guān)系數(shù)據(jù)的內(nèi)在規(guī)律/結(jié)構(gòu)稀缺標(biāo)簽下的映射+規(guī)律最大化累計(jì)獎(jiǎng)勵(lì)的決策策略反饋機(jī)制預(yù)測(cè)值與真實(shí)標(biāo)簽的誤差無(wú)外部反饋,數(shù)據(jù)自驅(qū)動(dòng)標(biāo)簽誤差+數(shù)據(jù)結(jié)構(gòu)輔助環(huán)境的獎(jiǎng)勵(lì)信號(hào)典型任務(wù)分類(lèi)、回歸聚類(lèi)、降維、特征提取分類(lèi)、回歸(標(biāo)簽稀缺)決策、控制、博弈核心挑戰(zhàn)標(biāo)簽成本高、過(guò)擬合評(píng)價(jià)標(biāo)準(zhǔn)模糊、訓(xùn)練難度大數(shù)據(jù)分布匹配、模型復(fù)雜度獎(jiǎng)勵(lì)設(shè)計(jì)、訓(xùn)練不穩(wěn)定56A7A8A9不同訓(xùn)練樣本數(shù)量下手寫(xiě)數(shù)字識(shí)別的算法表樣本數(shù)量測(cè)試集準(zhǔn)確率過(guò)擬合度預(yù)測(cè)穩(wěn)定性核心表現(xiàn)描述15065%~75%極高極差模型僅記住少量樣本的特征,對(duì)新樣本泛化能力極弱;易把“筆畫(huà)粗細(xì)/位置偏移”誤判為不同數(shù)字,比如把“偏左的1”判為“7”50080%~85%高較差能識(shí)別部分核心特征(如“0的圓形、8的雙圈”),但對(duì)相似數(shù)字(如3/8、5/6)仍大量誤判;準(zhǔn)確率提升但波動(dòng)大150090%~93%中等較好能學(xué)習(xí)到數(shù)字的通用特征(如“2的曲線、4的拐角”),相似數(shù)字誤判顯著減少;過(guò)擬合程度降低,預(yù)測(cè)結(jié)果更穩(wěn)定600095%~97%低優(yōu)秀模型充分學(xué)習(xí)到數(shù)字的本質(zhì)特征(不受筆畫(huà)、位置、粗細(xì)影響),僅在極端噪聲樣本(如模糊/殘缺數(shù)字)下少量誤判;接近算法在MNIST上的“性能天花板”核心原理:可以把模型比作“學(xué)認(rèn)數(shù)字的小孩”:只教150個(gè)例子(150個(gè)樣本):小孩只認(rèn)識(shí)“媽媽寫(xiě)的0、爸爸寫(xiě)的1”,遇到老師寫(xiě)的0就不認(rèn)識(shí)了(泛化差、準(zhǔn)確率低);教500/1500個(gè)例子:小孩見(jiàn)過(guò)不同人寫(xiě)的數(shù)字,總結(jié)出“0是圓的、1是豎的”,能認(rèn)大多數(shù)數(shù)字(準(zhǔn)確率提升);教6000個(gè)例子:小孩見(jiàn)過(guò)各種奇葩寫(xiě)法的數(shù)字(潦草的、歪的、細(xì)的),幾乎能認(rèn)所有情況(準(zhǔn)確率接近上限)。第十二章1YouOnlyLookOnce2A304YOLOv5的模型文件格式為ONNX(全稱(chēng)OpenNeuralNetworkExchange);而YOLOv5原生訓(xùn)練導(dǎo)出的模型格式是.pt(PyTorch權(quán)重文件),需先轉(zhuǎn)換為ONNX格式才能被OpenCV調(diào)用。5實(shí)用結(jié)論(結(jié)合YOLOv5訓(xùn)練實(shí)踐)(1)YOLOv5的“最優(yōu)訓(xùn)練輪數(shù)”:絕大多數(shù)場(chǎng)景下,YOLOv5的最優(yōu)輪數(shù)在300~1500輪之間(具體取決于數(shù)據(jù)集大小):小數(shù)據(jù)集(<1000樣本):300~500輪即可收斂;中等數(shù)據(jù)集(1000~10000樣本):800~1500輪達(dá)到最優(yōu);大數(shù)據(jù)集(>10000樣本):1500~2000輪后精度提升已不明顯。(2)6000輪完全無(wú)必要:YOLOv5采用了早停(EarlyStopping)、正則化等機(jī)制,但6000輪仍會(huì)觸發(fā)嚴(yán)重過(guò)擬合,且訓(xùn)練時(shí)間大幅增加(如100輪1小時(shí),6000輪需60小時(shí)),總結(jié):訓(xùn)練輪數(shù)增加的核心變化:精度先升后降,損失(train)持續(xù)降、損失(val)先降后升,過(guò)擬合從無(wú)到嚴(yán)重;1500輪是多數(shù)場(chǎng)景的“最優(yōu)輪數(shù)”(精度峰值,過(guò)擬合可控),6000輪因嚴(yán)重過(guò)擬合導(dǎo)致效果回落;關(guān)鍵判斷依據(jù):以val/box_loss和mAP_0.5為核心,而非單純追求“更多輪數(shù)”。6詳見(jiàn)以下步驟:一、核心需求利用YOLOv5框架,基于防護(hù)帽相關(guān)圖像數(shù)據(jù)集,訓(xùn)練一個(gè)能精準(zhǔn)識(shí)別圖像中人員是否佩戴防護(hù)帽(安全帽/頭盔)的目標(biāo)檢測(cè)模型,最終實(shí)現(xiàn)對(duì)單張圖片/視頻/攝像頭畫(huà)面中防護(hù)帽的實(shí)時(shí)檢測(cè)。二、完整實(shí)操步驟步驟1:環(huán)境準(zhǔn)備(基礎(chǔ)前提)首先搭建YOLOv5運(yùn)行的Python環(huán)境,推薦使用Anaconda管理環(huán)境:#1.創(chuàng)建并激活虛擬環(huán)境(Python3.8/3.9兼容性最佳)condacreate-nyolov5python=3.8condaactivateyolov5#2.安裝依賴(lài)(YOLOv5官方依賴(lài)+額外工具)pipinstalltorchtorchvisiontorchaudio--index-url/w
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年派駐浦發(fā)銀行駐腫瘤醫(yī)院引導(dǎo)員崗(北方金服外包項(xiàng)目)招聘?jìng)淇碱}庫(kù)及完整答案詳解1套
- 四川農(nóng)商聯(lián)合銀行備考題庫(kù)科技部2026年校園招聘?jìng)淇碱}庫(kù)含答案詳解
- 2026年江西省檢驗(yàn)檢測(cè)認(rèn)證總院特種設(shè)備檢驗(yàn)檢測(cè)研究院萍鄉(xiāng)分院招聘?jìng)淇碱}庫(kù)含答案詳解
- 中共啟東市委組織部2026年校園招聘?jìng)淇碱}庫(kù)附答案詳解
- 國(guó)家知識(shí)產(chǎn)權(quán)局專(zhuān)利局專(zhuān)利審查協(xié)作北京中心福建分中心2026年度專(zhuān)利審查員公開(kāi)招聘?jìng)淇碱}庫(kù)及答案詳解參考
- 中國(guó)煙草總公司鄭州煙草研究院2026年高校畢業(yè)生招聘?jìng)淇碱}庫(kù)附答案詳解
- 2026年浙江華潤(rùn)三九眾益制藥有限公司招聘?jìng)淇碱}庫(kù)及答案詳解1套
- 2026年第十師北屯市公安局面向社會(huì)公開(kāi)招聘警務(wù)輔助人員備考題庫(kù)參考答案詳解
- 2026年永康市科學(xué)技術(shù)局工作人員招聘?jìng)淇碱}庫(kù)有答案詳解
- 2026年阿合奇縣人民法院招聘?jìng)淇碱}庫(kù)附答案詳解
- 器官移植術(shù)后排斥反應(yīng)的風(fēng)險(xiǎn)分層管理
- 護(hù)坡綠化勞務(wù)合同范本
- 臨床績(jī)效的DRG與CMI雙指標(biāo)調(diào)控
- 2026年湛江日?qǐng)?bào)社公開(kāi)招聘事業(yè)編制工作人員備考題庫(kù)及完整答案詳解
- 2025-2026學(xué)年人教版數(shù)學(xué)三年級(jí)上學(xué)期期末仿真模擬試卷一(含答案)
- 2025年涼山教師業(yè)務(wù)素質(zhì)測(cè)試題及答案
- 2026年昭通市威信縣公安局第一季度輔警招聘(14人)筆試模擬試題及答案解析
- 氫能技術(shù)研發(fā)協(xié)議
- 2025交管12123學(xué)法減分整套試題帶答案解析(全國(guó)適用)
- 經(jīng)皮內(nèi)鏡下胃造瘺術(shù)護(hù)理配合
- 光伏電源項(xiàng)目工程建設(shè)管理資料表格格式匯編
評(píng)論
0/150
提交評(píng)論