<p>使用<em>cv2.boundingRect</em>将提供适合轮廓的最小非旋转矩形。<em>cv2.boundingRect</em>结果:</p>
<p><a href="https://i.stack.imgur.com/3pViN.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/3pViN.png" alt="enter image description here"/></a></p>
<p>您将需要使用<em>cv2.boundingRect</em>,而不是使用<em>cv2.minareRect</em>来获得一个适合轮廓的矩形。<em>cv2.minarerect</em>结果:</p>
<p><a href="https://i.stack.imgur.com/fDTod.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/fDTod.png" alt="enter image description here"/></a></p>
<p>在获得旋转矩形信息后,需要找到模型点与当前点之间的仿射变换矩阵。当前点是在旋转矩形中找到的点,模型点是原始对象的点。在本例中,对象的初始位置(0,0)和旋转矩形的宽度和高度。在</p>
<p>仿射在这里可能有点过头了,但为了一般性,使用了仿射变换。在</p>
<p><a href="https://i.stack.imgur.com/zxR1W.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/zxR1W.png" alt="enter image description here"/></a></p>
<p>详细说明在代码中。在</p>
<pre><code>import cv2
import numpy as np
img = cv2.imread('Bcm3h.png')
## (1) Convert to gray, and threshold
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
th, threshed = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV)
## (2) Morph-op to remove noise
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
morphed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, kernel)
## (3) Find the max-area contour
cnts = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
cnt = sorted(cnts, key=cv2.contourArea)[-1]
## This will extract the rotated rect from the contour
rot_rect = cv2.minAreaRect(cnt)
# Extract useful data
cx,cy = (rot_rect[0][0], rot_rect[0][1]) # rect center
sx,sy = (rot_rect[1][0], rot_rect[1][1]) # rect size
angle = rot_rect[2] # rect angle
# Set model points : The original shape
model_pts = np.array([[0,sy],[0,0],[sx,0],[sx,sy]]).astype('int')
# Set detected points : Points on the image
current_pts = cv2.boxPoints(rot_rect).astype('int')
# sort the points to ensure match between model points and current points
ind_model = np.lexsort((model_pts[:,1],model_pts[:,0]))
ind_current = np.lexsort((current_pts[:,1],current_pts[:,0]))
model_pts = np.array([model_pts[i] for i in ind_model])
current_pts = np.array([current_pts[i] for i in ind_current])
# Estimate the transform betwee points
M = cv2.estimateRigidTransform(current_pts,model_pts,True)
# Wrap the image
wrap_gray = cv2.warpAffine(gray, M, (int(sx),int(sy)))
# for display
cv2.imshow("dst",wrap_gray)
cv2.waitKey(0)
#cv2.imwrite("001.png", dst)
</code></pre>
<p>结果:</p>
<p><a href="https://i.stack.imgur.com/6ktFR.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/6ktFR.png" alt="enter image description here"/></a></p>