Opencv-Pythonノート——両目測距(一)

19682 ワード

Opencv-Pythonノート——両目測距
休暇中に着手した両目視覚の項目では、ノートは私の印象ノートに記入されています.今プロジェクトは私がCSDNの上でそれを置く必要があるため、何枚かのピクチャーが印象のノートの中から導くことができないためリンクをここに置いて、する時多くの先輩の仕事を参考にして、ここは先に一つ一つ感謝しないで、プロジェクトが次のステップをやり遂げてきっと更にブログを更新するあの時更に詳しく感謝します.イメージノートリンク
カメラの標定とキャリブレーション
ツール:Matlab、碁盤図(写真)、pythonプロセス:1、単目:1.1、python:カメラで撮影した画像を保存する;matlab:カメラキャリブレーションApp 1.2、両目各角度と位置の碁盤図を複数枚撮影し、それぞれ1.3を保存し、Matlabを導入する
オプションを選択する標定を行い、誤差が0.5 MM未満であれば許容する、データをワークスペースに保存し、変数1.4を開く.k1,k2=cameraParma.RD;p1,p2=cmameraParam.TD;k3=0; 1.5. マトリクスの取得:fx,fyはfcの2つ,cx,cyはccの2つ
        Focal Length:   fc
        Principal point:    cc
        2、  :
        2.1、Python:              ,  ;  matlab         R T
        3、  :
#  
left_camera_matrix = np.array([[692.454591212115, 0., 305.409225800741],
                               [0.,669.698066026769, 264.508936113842],
                               [0., 0., 1.]])#done
left_distortion = np.array([[0.077081711200250,-0.220061292778494,-0.0004968108670932932,0.0006411932375060667,0.000000000000000]])#done



right_camera_matrix = np.array([[674.456695074239, 0., 306.434465883188],
                                [0., 650.163751797273, 256.821019862984],
                                [0., 0., 1.]])#done
right_distortion = np.array([[0.064970360468832,-0.336634672167974,-0.003030799919163,0.003667099404412,0.0000000000000]])#done


R=np.array([[0.999972132749184,-0.00256080461003690,-0.00701256050228641],
		[0.00259579617289607,0.999984204218748,0.00498529389574570],
                    [0.00699968336982408,-0.00500335814702436,0.999962984734923]])#done
T = np.array([-40.0385164688697,0.190937710515179,0.0788520575321127]) #       #done

size = (320,480) #        #done#fixed xy  

#      #size    

R1, R2, P1, P2, Q, validPixROI1, validPixROI2 = cv.stereoRectify(left_camera_matrix, left_distortion, right_camera_matrix, right_distortion, size, R,T)

#    map
#    

left_map1, left_map2 = cv.initUndistortRectifyMap(left_camera_matrix, left_distortion, R1, P1, size, cv.CV_16SC2)
right_map1, right_map2 = cv.initUndistortRectifyMap(right_camera_matrix, right_distortion, R2, P2, size, cv.CV_16SC2)


操作コードを読み込みます.
import cv2 as cv

cap=cv.VideoCapture(1)
i=0
while True:
	ret,frame=cap.read()
	cv.imshow('frame',frame)
	if cv.waitKey(1)==ord('s'):
		#frame2=cv.cvtColor(frame,cv.COLOR_BGR2GRAY)
		cv.resize(frame,(640480))#               ?
		cv.imwrite('G:/11hub/op/im%d.jpg'%i,frame)
		i+=1
	if cv.waitKey(1)==ord('q'):
		break
	if cv.waitKey(1)==ord('w'):
		print(frame.shape)
	
	
cap.release()
cv.destroyAllWindows()

分割コード:
def divide_img(frame,i):
	n=1
	m=2
	img = frame
	h = img.shape[0]
	w = img.shape[1]
	dis_h=int(np.floor(h/n))
	dis_w=int(np.floor(w/m))
    
	if i==0:
		sub=img[dis_h*0:dis_h*1,dis_w*0:dis_w*1,:]
	if i==1:
		sub=img[dis_h*0:dis_h*1,dis_w*1:dis_w*2,:]
	return sub

3、キャリブレーション3.1、両目標定でカメラの各パラメータを得た後、cv.stereoRectify( )で補正回転マトリクスRを得、投影マトリクスP、再投影マトリクスQ 3.2、cv.initUndistortRectifyMap( )でキャリブレーションマッピングパラメータ(left/right_map 1/2)3.3でcv.remap( )で入力した左右の画像をキャリブレーションし、パラメータalphaは-1、01、0は自動的にスケーリングして平行移動し、有効画素を保持し、01拡大・縮小、1元の画像のすべてを表示、-1自動拡大・縮小
質問:
  • 画像の大きさと結果に影響はありますか?
  • コードのsizeの値は影響しますか?

  • 視差マップ生成
    imgL = cv.cvtColor(img1_rectified, cv.COLOR_BGR2GRAY)
    imgR = cv.cvtColor(img2_rectified, cv.COLOR_BGR2GRAY)  #      BM     
    
    stereo = cv.StereoBM_create(numDisparities=16*num, blockSize=blockSize)#BM  
    disparity = stereo.compute(imgL, imgR) #     
    

    深さマップを擬似カラーマップに変換
    def convertPNG(pngfile):
        # READ THE DEPTH
    	im_depth = pngfile
        #apply colormap on deoth image(image must be converted to 8-bit per pixel first)
    	im_color=cv.applyColorMap(cv.convertScaleAbs(im_depth,alpha=15),cv.COLORMAP_JET)#cv.convertScaleabs---    
    	##im_color=cv.applyColorMap(im_depth,cv.COLORMAP_JET)
    	return im_color
    

    3 D座標を作成