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
    _, frame = cap.read()

    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):

    _, frame = cap.read()

    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