2017-08-01 12 views
1

私はPythonでOpenCVを使用しています。 Iは、サブ画像に主画像の部分を選択してコピーするために、次のコードを使用している:切り抜いた画像から元の画像にピクセルを変換するOpenCV

boxPointsからトリミングされる領域の周囲に境界ボックスを構成する4点の配列である
boundingBoxRotatedRect = cv2.minAreaRect(boxPoints) 
if boundingBoxRotatedRect[2] < -45: 
    boundingBoxRotatedRect = (boundingBoxRotatedRect[0], (boundingBoxRotatedRect[1][1],boundingBoxRotatedRect[1][0]), boundingBoxRotatedRect[2] + 90) 
M = cv2.getRotationMatrix2D(boundingBoxRotatedRect[0], boundingBoxRotatedRect[2], 1.0) 
size = np.int0(boundingBoxRotatedRect[1]) 
size = (size[0],size[1]) 
dst = cv2.warpAffine(mainImage, M, (mainImage.shape[1], mainImage.shape[0])) 
subImage = cv2.getRectSubPix(dst, size, boundingBoxRotatedRect[0]) 

主画像、boundingBoxRotatedRectは回転したrectオブジェクトとして表される同じボックス、Mは回転行列、sizeはバウンディングボックスの幅/高さ、mainImageは切り取られる主画像、subImageは最終的にメイン画像から切り取られています。下にリンクされている写真は、何が起こっているかをさらに説明します。

Explanation Image

私の質問は:私はサブイメージを編集するためにOpenCVの描画機能を使用する場合、どのように私はmainImageの対応する画素に戻って、同じ図面を置くことができますか?例えば、提供された説明画像で画像の形を使用している場合、私はsubImageに直立したスマイリーな顔を描いていますが、mainImage上の適切な場所にある正しい向きの対角線のスマイリーの顔にどのように変換できますか?

答えて

1

解決策が見つかりました。ホモグラフィ!

でコード上に置換:

#If bottomLeft = true, boxPoints[0] corresponds to btm-lft corner of subImage. 
#If bottomLeft = false, boxPoints[0] corresponds to btm-right corner of subImage. 
bottomLeft = True 

boundingBoxRotatedRect = cv2.minAreaRect(boxPoints) 
if boundingBoxRotatedRect[2] < -45: 
    boundingBoxRotatedRect = (boundingBoxRotatedRect[0], (boundingBoxRotatedRect[1][1],boundingBoxRotatedRect[1][0]), boundingBoxRotatedRect[2] + 90) 
    bottomLeft = False 
M = cv2.getRotationMatrix2D(boundingBoxRotatedRect[0], boundingBoxRotatedRect[2], 1.0) 
size = np.int0(boundingBoxRotatedRect[1]) 
size = (size[0],size[1]) 
dst = cv2.warpAffine(mainImage, M, (mainImage.shape[1], mainImage.shape[0])) 
subImage = cv2.getRectSubPix(dst, size, boundingBoxRotatedRect[0]) 

#Get homography matrix 
if bottomLeft: 
    pts_src = np.array([[0, size[0] - 1], [0, 0], [size[1] - 1, 0],[size[1] - 1, size[0] - 1]]) 
else: 
    pts_src = np.array([[size[1] - 1, size[0] - 1], [0, size[0] - 1], [0, 0], [size[1] - 1, 0]]) 
pts_dst = boxPoints 
h, status = cv2.findHomography(pts_src, pts_dst) 


## BELOW, REPLACE "[x, y], [X2, Y2], ...]" WITH LIST OF POINTS FROM SUBIMAGE TO BE TRANSLATED TO MAINIMAGE 
a = np.array([[x, y], [X2, Y2], ...] dtype='float32') 
a = np.array([a]) 
pointsOut = cv2.perspectiveTransform(a, h) 
pointsOut = pointsOut[0] 

#Then use the points in pointsOut to draw whatever you want! 
関連する問題