I’m afraid opacity doesn’t work like that and once its applied to an element it becomes ‘atomic’ in that the element and all descendants will all have the opacity applied and it cannot be reset on children.
There is a solution that involves using an absolutely placed pseudo element to hold the opacity which is then confined to that element only as it just contains the background image only.
The padding is working fine and is applied in your rules which can be seen by increasing or decreasing the padding. Maybe you were expecting something else?
The above will allow you to use any images and have them at half opacity automatically but of course you could simply do as coothead suggests above and make the images 50% opaque to start with and avoid the extra code.
There are 2 things that I note you are using and one is background-origin:padding-box which is a wasted rule as that is the default and not needed. I was wondering whether instead you only wanted the background image inside the padding box and then that rule should have had a value of content-box instead? However it’s not needed in my example as you would simply use the top, left, right and bottom with appropriate offsets to indent the background image as required.
The other thing I notice is that you are using ‘background-size:contain’ which means the image may not always fill the background completely and you will get gaps at top or side when the element can no longer fit the image. Perhaps you meant to use the value cover instead of contain?