<p>我有一个答案给你,虽然还不完整,但可能对你有帮助。
我使用<a href="https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm" rel="nofollow noreferrer">Ramer–Douglas–Peucker algorithm</a>来确定轮廓,然后从轮廓中提取矩形框。然后我使用“长方体”区域占图像区域的百分比来删除较小的框。这会删除大部分的垃圾箱。在</p>
<p>下面是我在python代码中所做的一个示例:</p>
<p>寻找轮廓:</p>
<pre><code> def findcontours(self):
logging.info("Inside findcontours Contours...")
# Pre-process image
imgGray = self.imgProcess.toGrey(self.img)
logging.info("Success on converting image to greyscale")
imgThresh = self.imgProcess.toBinary(imgGray)
logging.info("Success on converting image to binary")
logging.info("Finding contours...")
image, contours, hierarchy = cv2.findContours(imgThresh.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
logging.info("Contours found: %d", len(contours))
return contours
</code></pre>
<p>使用等高线查找方框:</p>
^{pr2}$
<p>要组合这两种方法:</p>
<pre><code> def process(self):
logging.info("Processing image...")
self.shape_handler = ShapeHandler(self.img)
contours = self.shape_handler.findcontours()
logging.info("Finding Rectangles from contours...")
rectangles = self.shape_handler.getRectangles(contours)
img = self.imgDraw.draw(self.img, rectangles, "Green", 10)
cv2.drawContours(img, array, -1, (0,255,0), thickness)
self.display(img)
logging.info("Amount of Rectangles Found: %d", len(rectangles))
</code></pre>
<p>显示图像:</p>
<pre><code> def display(self, img):
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
</code></pre>
<p>最后一步是合并任何相交的长方体,因为您只对边/角感兴趣,然后只得到面积最大的长方体。查看<a href="https://stackoverflow.com/questions/19079619/efficient-way-to-combine-intersecting-bounding-rectangles">here</a>以检查如何组合框。在</p>
<p>{我的源代码:^ a3}</p>
<p>图像结果:</p>
<p>正常:</p>
<p><img src="https://i.stack.imgur.com/fNYCT.jpg" alt="Normal"/></p>
<p>倾斜:</p>
<p><img src="https://i.stack.imgur.com/eBbZa.jpg" alt="Skew"/></p>
<p>希望这有帮助!在</p>