Your second idea works!
- Use the "Import images as planes" option (activate addon in preferences) or make Empty and set display as image.
- Then make a dummy camera and parent it (keep transform) to you image plane
- Activate textured view and make sure that in Materials -> Settings you set Blend mode to "Alpha blend" (or use alpha is activated if you used an Empty as Image)
- You can use +/- to zoom camera border, so its no longer in view. (changing the zoom here works only while camera not locked to view)
- Make the plane "unselectable" (by clicking cursor symbol in Outliner) otherwise you will always select the plane if locked to view ;)
- Finally activate "Lock Camera to view"
And you're done!
Here is my implementation:

+
Here is the same procedure in Code:
PS: However there is a small TODO section for setting the 3d view to the Camera view in script, which i havent quite figured out how to do yet
import bpy
from mathutils import Euler ##For Rotations
######Deletes all Objects in default blender startup
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)
######
########### Make Objects you need: Camera-Dummy and Empty as Image (and set it as parent)
imgEmpty = bpy.data.objects.new("myImgEmpty", None)
scene = bpy.context.scene
bpy.context.collection.objects.link(imgEmpty)
imgEmpty.location = (0, 0, -1.5)
imgEmpty.rotation_euler = Euler((0, 0, 0), 'XYZ')
imgEmpty.empty_display_type = 'IMAGE'
imgOverlay = bpy.data.images.load("C:/Users/robert/Desktop/Installers/2019/blender-2.80.0-git.d30f72dfd8ac-windows64/TestOverlay.png", check_existing=True) ##### CHANGE PATH !!!
imgEmpty.data = imgOverlay
bpy.ops.object.camera_add(location=(0, 0, 0), rotation=(1.5708, 0, 0)) ##90deg in radian
dummyCamera = bpy.context.view_layer.objects.active
layer = bpy.context.view_layer
layer.update()
imgEmpty.parent = dummyCamera
###########
################ Set 3d view to Camera view and Zoom
#TODO ;)
################
##################### Set camera to Lock camera to view and Set 3d View to Textured view
for area in bpy.context.screen.areas:
if area.type == 'VIEW_3D':
for space in area.spaces:
if space.type == 'VIEW_3D':
space.lock_camera = True
space.shading.type = 'MATERIAL'
#####################
Happy Blending!