Quality Of Export Image

An IPVMU attendee mentions that, "We use a lot of still images for quickly sending to others when executable files (proprietary video players) will not go through network security and firewalls." What camera setting or resolution parameter determines the overall quality of a still photo (.jpeg)? Is this adjustable?


Isn't that primarily set in the VMS/NVR? I do know that it is a setting in Axis cameras, but I'm a bit confused what the quesiton is without more details about their setup...

Still images generated directly from the *camera* (many have a "snapshot" feature), or a still image generated from the *VMS*?

In this context, I believe he is asking about the VMS's implementation. I am assuming they generate an image with the same resolution / compression level as the video it is being exported from, no?

I am curious if VMS systems pull the nearest I frame? what if the frame it is on is a P frame? What do they do there?

My experience is that the visible quality level is nearly identical to the video it was pulled from.

My guess is that the answer varies wildly across VMS platforms and there is not going to be a universal response. At a mimimum though, the snapshot would typically be limited to the maximum resolution/framerate/compression settings for that camera. So if you have a camera that can stream at say 8MP and 1MP, and you're taking a snapshot of the 1MP stream, you're going to get 1MP "detail".

A wrinkle would be in a case where lets say you're streaming and recording 8MP of data, but you've got the cameras 9 up in a window and you take a snapshot of one. What is the VMS snapping? The *actual* stream, or the pixels shown on-screen (which would be much less).

Hard to answer without specifics.

It depends on 2 things, the quality of the decoded frame, and the quality setting you apply when you re-encode the video frame to a JPEG image.

Generally, what happens is that the video stream is decoded from whatever format it comes in (H.264, MPEG4, JPEG) to an 2D array of pixel values (similar to uncompressed .BMP files). The decoded array can then be drawn on the screen or it can be compressed to another format (in this example JPEG).

The JPEG encoder has no concept of the "quality" of the source, it doesn't care if the array came from a 128KB/S or a 8MB/S stream. To the encoder the array is just a bunch of pixels. So when you pick a quality setting for the encoding process it just tells the encoder how faithfully it needs to reproduce the array when it is later decoded somewhere else.

I don't know if other clients can export snapshots between two arbitrary frames in the feed, but we do it and I think most others should be able to as well. Obviously, for the MPEG-derived formats you need to decode frames that you simply discard in order to get to the frame you are looking for, but that's very minor performance hit compared to how annoyed you'd be if you have to export with a resolution of 1 second (or more!).

It also means that if you have a heavily compressed feed you might be wasting bytes if you set the quality of the jpeg encoder to max (since the jpeg encoder will now use many bits to ensure that you get back an accurate, but poor quality frame). Naturally, there's no way for the JPEG encoder to magically improve on the image quality regardless of the quality setting.

Let me know if this makes sense (or not)

Morten, thanks, as usual!

The key section to me was:

The decoded array can then be drawn on the screen or it can be compressed to another format (in this example JPEG).

The JPEG encoder has no concept of the "quality" of the source, it doesn't care if the array came from a 128KB/S or a 8MB/S stream.

That explains why the image size can potentially be so big. Alternatively, if for whatever reason, a VMS chooses a high compression level, the video quality could be degraded. It would be weird for a VMS to do that but I think I understand the workflow now.