Canny finds edges. Edges are basically places of very large derivative in the image. Then the canny algorithm cleans it up a little.

FindContours seems to be a clutch dude

http://dsynflo.blogspot.com/2014/10/opencv-qr-code-detection-and-extraction.html

This guy uses it to

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

# Take each frame

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,100,200)
#ret,thresh = cv2.threshold(gray,50,255,cv2.THRESH_BINARY)

kernel = np.ones((5,5),np.uint8)
edges = cv2.dilate(edges,kernel,iterations = 5) # really chunks it up

contours,hierarchy= cv2.findContours(edges,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2:]
cv2.drawContours(frame, contours, -1, (0,0,255), 3)
cv2.imshow('res',cv2.pyrDown(frame))
k = cv2.waitKey(5) & 0xFF
if k == 27:
break

cv2.destroyAllWindows()


The dilation reduces the number of contours to something more reasonable

Each contour is of the format [[[x y]], [[x y]], [[x y]]]

I had a problem with draw contours until I found out I needed to write onto a color image with it.

The good features to track

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,25,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(frame,(x,y),8,[0,0,255],-1) #image center radius color thickness
cv2.imshow('image',cv2.pyrDown(frame))

k = cv2.waitKey(5) & 0xFF
if k == 27:
break


The 25 is number of corners, 0.01 is a quality cutoff (1% of best corner quality found), 10 is minimum distance between corners