0

I am currently working on solar panel cropping from the images taken by the drone(attaching sample image). I have tried using contours but there wasn't a proper outcome. It was not detecting all solar panels in the image some of them were missing. I struck here itself. How do I proceed further? Please help me with this problem.

Thank you,

Sample Code:

import cv2
import numpy as np
img = cv2.imread('D:\\SolarPanel Images\\solarpanel.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
edges = cv2.Canny(blur,100,200)    
th3 = cv2.adaptiveThreshold(edges,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)

im2, contours, hierarchy = cv2.findContours(th3, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print("Len of contours",len(contours)
try: hierarchy = hierarchy[0]
except: hierarchy = []

height, width,  = edges.shape
min_x, min_y = width, height
max_x = max_y = 0

# computes the bounding box for the contour, and draws it on the image,
for contour, hier in zip(contours, hierarchy):
    area = cv2.contourArea(contour)

    if area > 10000 and area < 250000:
        (x,y,w,h) = cv2.boundingRect(contour)
        min_x, max_x = min(x, min_x), max(x+w, max_x)
        min_y, max_y = min(y, min_y), max(y+h, max_y)
        if w > 80 and h > 80:
            cv2.rectangle(img, (x,y), (x+w,y+h), (255, 0, 0), 2)

            cv2.imshow('cont imge', img)
            cv2.waitKey(0)

enter image description here

janu777
  • 1,940
  • 11
  • 26
akhil s
  • 137
  • 2
  • 11

1 Answers1

2

To find contours in images where the object of importance is clearly distinguishable from the background, you can always try converting the image to HSV format and then contour. I did the following:

import cv2
import numpy as np
img = cv2.imread('panel.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 
ret,thresh1 = cv2.threshold(hsv[:,:,0],100,255,cv2.THRESH_BINARY)
im2, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, 
cv2.CHAIN_APPROX_SIMPLE)
try: hierarchy = hierarchy[0]
except: hierarchy = []
for contour, hier in zip(contours, hierarchy):
    area = cv2.contourArea(contour)
    if area > 10000 and area < 250000:
       rect = cv2.minAreaRect(contour)
       box = cv2.boxPoints(rect)
       box = np.int0(box)
       cv2.drawContours(img,[box],0,(0,0,255),2)
       cv2.imshow('cont imge', img)
       cv2.waitKey(0)
cv2.imwrite("result.jpg",img)

Result: enter image description here

janu777
  • 1,940
  • 11
  • 26
  • Thank you for your help, but I would like to crop these detected contours. How would I proceed? – akhil s Jul 19 '18 at 06:18
  • First you must rotate the image the bounding rect and then crop it. https://stackoverflow.com/questions/37177811/crop-rectangle-returned-by-minarearect-opencv-python – janu777 Jul 19 '18 at 07:33
  • Thank you so much @janu777 Finally, I cropped them but I have to crop each panel as well from that cropped image. – akhil s Jul 20 '18 at 04:57