title: OpenCV - How to find rectangle contour of a rectangle with round corner?
body: <p>I'm trying to find the contour of a rectangle object with round corner in a image. I tried <code>HoughLinesP</code> and <code>findContours</code>, but did not achieve the desired result.</p>
  
  <p><a href="https://i.stack.imgur.com/NoaKT.png" rel="noreferrer"><img src="https://i.stack.imgur.com/NoaKT.png" alt="results"></a></p>
  
  <p>I want to find the rectangle like this:
  <a href="https://i.stack.imgur.com/Ys6f3.png" rel="noreferrer"><img src="https://i.stack.imgur.com/Ys6f3.png" alt="desired result"></a></p>
  
  <p>Code:</p>
  
  <pre><code>import cv2
  import matplotlib.pyplot as plt
  import util
  
  image = cv2.imread("./img/findrect0.png", 1)
  gray = util.grayImage(image)
  
  edges = cv2.Canny(image, 50, 200)
  lines = cv2.HoughLinesP(edges, 1, cv2.cv.CV_PI/180, 50, minLineLength=50, maxLineGap=10)[0]
  linesImage = image.copy()
  util.drawLines(linesImage, lines, thickness=10)
  
  contoursImage = image.copy()
  (contours, hierarchy) = cv2.findContours(gray.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  
  util.drawContours(contoursImage, contours, thickness=10)
  
  util.showOpenCVImagesGrid([image, edges, linesImage, contoursImage], 2, 2, titles=["original image", "canny image", "lines image", "contours image"])
  </code></pre>
  
  <p>util:</p>
  
  <pre><code>import cv2
  import math
  import matplotlib.pyplot as plt
  
  def showOpenCVImagesGrid(images, x, y, titles=None, axis="on"):
      fig = plt.figure()
      i = 1
      for image in images:
          copy = image.copy()
          channel = len(copy.shape)
          cmap = None
          if channel == 2:
              cmap = "gray"
          elif channel == 3:
              copy = cv2.cvtColor(copy, cv2.COLOR_BGR2RGB)
          elif channel == 4:
              copy = cv2.cvtColor(copy, cv2.COLOR_BGRA2RGBA)
  
          fig.add_subplot(x, y, i)
          if titles is not None:
              plt.title(titles[i-1])
          plt.axis(axis)
          plt.imshow(copy, cmap=cmap)
          i += 1
      plt.show()
  
  
  def grayImage(image):
      gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
      return gray
  
  
  def drawLines(image, lines, thickness=1):
      for line in lines:
          # print("line="+str(line))
          cv2.line(image, (line[0], line[1]), (line[2], line[3]),
                  (0, 0, 255), thickness)
  
  
  def drawContours(image, contours, thickness=1):
      i = 0
      for contour in contours:
          cv2.drawContours(image, [contours[i]], i, (0, 255, 0), thickness)
          area = cv2.contourArea(contour)
          i += 1
  </code></pre>
  
  <p>I'm using <code>Python 2.7.13</code> and <code>OpenCV 2.4.13.3</code>.</p>
  
  <p>I've been thinking to extend these lines and get intersection points of lines. Finally, I will get four coordinates of rectangle.
  But if the image is more complex, I don't know how to deal with.</p>