If you are taking the images you have one good option: taking multiple images and stitching them together. The open source tool for this would be hugin. This works but it can be hard to pull of for non static subjects. Fun fact: you can also lower noise or simulate a larger aperture that way.
Now as far as adding resolution to an existing image is concerned, it can’t really be done. In essence algorithms are either blury or make stuff up. If the image is suitably vector like automated or manual tracing (inkscape would be the open source tool) can work well.
If it’s not a vector, you can upscale the image (by a factor of 2 for each side if possible), sharpen it and then add some noise/grain to give it some fake detail. It’s not quite as bad of an idea as it sounds but obviously far from good.
There is other techniques out there too trying to synthesize detail but from my experience they don’t work well.
There seems to be some interesting research going on into using artificial intelligence of sorts (deep convolutional neural networks). This article by flipboard is relatively accessible. With that said I haven’t seen any production ready implementation of this and I have the suspicion that they will create really strange artifacts. But we’ll see.