I am working on a similar problem and came up with similar methodologies. I also used the Canny filter which worked quite well (http://en.wikipedia.org/wiki/Canny_edge_detector).
However, it all broke down with complex patterns in the foreground/background. I'm currently trying to incorporate more structural information about the foreground objects.
Learning algorithms is probably another option here? Just not sure how to frame the problem for a learning algorithm.