Problem with Projection of Bones
You should multiple the coordinate by the matrix_world before passing to world_to_camera_view. The coordinates are not modified when you rotate, translate, scale an object. Instead those transformations are placed in the matrix_world. 

for obj in bpy.data.objects:
  if obj.type == "MESH":
    for v in obj.data.vertices:
      co = obj.matrix_world * Vector((v.co.x, v.co.y, v.co.z, 1))
      co = world_to_camera_view(scene, camera, co)