OpenCV: findContours() messing with images?

Hi,

We used GRIP for Stronghold and was super nice and easy. Now, I want to take it to the next level with OpenCV.

I am currently having a lot of trouble just trying to find a contour in anything! The findContours function seems to be interfering with something which makes the edges image deteriorate.
For example, here is the Canny edge with and without it being the source of the findContour function: http://imgur.com/a/7kqAw
Here is the super simple code I am using:


import cv2 as cv
import numpy as np
img = cv.imread("29.jpg")#Sample image of Field
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #Convert to gray...just to try

edges = cv.Canny(gray, 200, 300)
#Finds the contours
image, contours, hierarchy = cv.findContours(edges,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE)
#Draws
cv.drawContours(img, contours, 1, (0, 255,255), 3)
#Shows
cv.imshow("edges!", edges)
cv.imshow("mask!", gray)
cv.imshow("frame!", img)

k = cv.waitKey(0) 
cv.destroyAllWindows()

Because the image deteriorates when put through the findContours function, I feel that it is never able to find anything. This doesn’t just happen when I put the edges image through, it happens when I try things like masks too.

I am super new to OpenCV so there is a strong possibility that there is something that I am doing completely wrong.

Any help would greatly be appreciated!

If you’re using findContours(), you don’t need to use Canny Edge Detection. By using Canny first, you’re narrowing down the image and giving findContours() less information to work with, and so it’s tolerances will cut out anything too small

Here’s our code for acquiring the goal, although it is in C++ instead of Python I believe the API is roughly the same

Alright, makes sense. But do you know why it makes the input image so weird even though it isn’t outputing to it? That seems to be the problem and it affects everything from edge input to masks.

Firstly, I would recommend converting to HSV and doing HSV filtering at some point (but it sounds like gray was just temporary).

I think doing HSV filtering would help a bit, but it also might not.
I can PM you our code, it will be going to github once I’ve cleaned it up but I can give it you now if it would help.

Also, in my code if I draw contours I don’t just call the function, I put the result into a varialbe, like:

outImage = cv2.drawContours(origImage, contours, -1, (255, 255, 0), 1)

and it looks like you don’t have that.

So I would say to do HSV filtering now, I can give you my code to do it if you want, and to also look into the variable return thingy.

If you want to keep the unmodified image, create a copy before calling findContours:

import cv2 as cv
import numpy as np
img = cv.imread("29.jpg")#Sample image of Field
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) #Convert to gray...just to try

edges = cv.Canny(gray, 200, 300)
#Finds the contours
scratch = edges.copy()
image, contours, hierarchy = cv.findContours(scratch,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_NONE)
#Draws
cv.drawContours(img, contours, 1, (0, 255,255), 3)
#Shows
cv.imshow("edges!", edges)
cv.imshow("mask!", gray)
cv.imshow("frame!", img)

k = cv.waitKey(0) 
cv.destroyAllWindows()