Alright, so I found I was to do this but this is not really ideal,
Basically, this will select all the visible vertices on the currently selected objects.
As for how first go into camera view then into edit mode and draw a box using box selection and it will select every vertice that's visible
def selectVerts():
bpy.ops.object.editmode_toggle()
for area in bpy.context.screen.areas:
if area.type == "VIEW_3D":
for region in area.regions:
if region.type == "WINDOW":
view3dArea = area
view3dRegion = region
break
override = bpy.context.copy()
override['area'] = view3dArea
override['region'] = view3dRegion
bpy.ops.view3d.view_camera(override)
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=10)
bpy.ops.view3d.select_box(override, xmin=0, xmax=10000, ymin=0, ymax=10000, mode='SET')
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=10)
bpy.ops.view3d.select_box(override, xmin=0, xmax=10000, ymin=0, ymax=10000, mode='SET')
bpy.ops.object.editmode_toggle()
bpy.ops.view3d.view_camera(override)
The biggest issue with this method is that if the object is too far away not all vertices are drawn by blender, so it gives really inaccurate results in such cases.