Camera coverage calculation inside a room
Bisection using frustrum planes.

In the answer to this How to find all objects in the Camera&#39;s view with Python? @ideasman42 has written a little method to get the for planes of the camera frustrum.
For a simple room can utilize this to chop away any walls
In gif above the wireframe box roof included is chopped to result and its percentage of originals face area printed to system console.
Script: Run in object mode with room as context and camera of interest the current active scene camera.
The mesh created after chopping and removing mesh outside is added to scene with global coordinates.
EDIT corrected for ortho camera.
import bpy
import bmesh

def camera_as_planes(scene, obj):
    &quot;&quot;&quot;
    Return planes in world-space which represent the camera view bounds.
    &quot;&quot;&quot;
    from mathutils.geometry import normal

    camera = obj.data
    # normalize to ignore camera scale
    matrix = obj.matrix_world.normalized()
    frame = [matrix @ v for v in camera.view_frame(scene=scene)]
    origin = matrix.to_translation()

    planes = []
    from mathutils import Vector
    is_persp = (camera.type != 'ORTHO')
    for i in range(4):
        # find the 3rd point to define the planes direction
        if is_persp:
            frame_other = origin
        else:
            frame_other = frame[i] + matrix.col[2].xyz

        n = normal(frame_other, frame[i - 1], frame[i])
        d = -n.dot(frame_other)
        planes.append((n, frame_other, d))

    if not is_persp:
        # add a 5th plane to ignore objects behind the view
        n = normal(frame[0], frame[1], frame[2])
        d = -n.dot(origin)
        planes.append((n, frame[0], d))

    return planes


context = bpy.context
scene = context.scene
dg = context.evaluated_depsgraph_get()
ob = context.object
camera = scene.camera
cloc = camera.matrix_world.translation

bm = bmesh.new()
bm.from_object(ob, dg)

bm.transform(ob.matrix_world)
total_face_area = sum(f.calc_area() for f in bm.faces)
for n, cf, _ in camera_as_planes(scene, scene.camera):
    bmesh.ops.bisect_plane(
            bm,
            geom=bm.verts[:] + bm.edges[:] + bm.faces[:],
            plane_no=-n,
            plane_co=cf,
            clear_outer=True,
            )

face_area = sum(f.calc_area() for f in bm.faces)
# comment out (or delete) 3 lines below for no new object
ob = bpy.data.objects.new(&quot;Test&quot;, bpy.data.meshes.new(&quot;Test&quot;))
bm.to_mesh(ob.data)
context.collection.objects.link(ob)

# print result
print(f&quot;{100 * face_area / total_face_area : 4.2f}%&quot;)