The ultimate way to do Mapillary

I have done a lot of experimentation on capturing photos on foot and bicycle, and I blive I have found the ultimate way:
A spherical camera on a pole attached to a backpack.

Pros:

  • Shows all angles - you never know what people are looking for.
  • Your body provides just about the best provides shock absorber when biking. No more blur from vibrations.
  • Decent cameras are priced lower than a single GoPro.
  • No need to aim at any specific point.
  • No need to keep the pole completely straight - most cameras measure the tilt in all directions and embed EXIF tags that allows Mapillary to compensate (Mapillary will fix this: https://github.com/mapillary/mapillary_issues/issues/2009)
  • The camera will see a lot more than a camera mounted straight on a bike.
  • Will work with any spherical camera.

Cons:

  • Camera resolution is not as good as even a decent cell phone. Remember you will only be looking at a fraction of the image, but expects full resolution.
  • The image is heavily processed just for viewing, which requires additional high pixel count to give a good image.
  • You will always be in the picture, but you can limit it a lot.
  • The camera can only make one exposure but have to cover many directions. Lit clouds in the sky may affect the exposure when it would not otherwise.
  • Some cameras have visible artifacts where images are stitched (such as LG and Samsung).
  • The cameras does not last as long on a single charge - a power bank is needed for significant sequences.
  • Will kill your Mapillary stats, as you only need 1 camera.
  • Requires quite a significant mount for use on cars.

My Ricoh Theta S mounted on a cheap lighting stand, from which I have removed the legs. It extends from 67 cm to 120 cm and is very light weight. The camera is mounted on a cheap ball head from dx.com (probably Aluminum Alloy Hot Shoe to 1/4" Male Screw w/ Ball Head - Black - Free shipping - DealExtreme) - I removed a mounting plate so there is just enough space for a micro USB connector, so the camera can be charged during operation.

How the camera is mounted in my backpack. Nothing special, just put into a pocket and attached to the handle. It is never straight when I use it, but the camera records the tilt and saves it to EXIF. Mapillary have promised to use that for corrections. There is software that will recompress the images with correction for that tilt, but I try to avoid an extra compression of already compressed images.
Note: It often helps to have something in the backpack, to keep the pole more straight.

Example on bicycle: Mapillary
Example on foot: Mapillary
Example on foot but hand held: Mapillary
Note: Mapillary have not yet implemented tilt correction!

10 Likes

Thanks a lot for that writeup! When the consumer-grade 360 cameras get just a little better than the current state, this will be really awesome.

I had similar experiences from the Faroe Islands, will write the technical details in a blog shortly.

2 Likes

Greetings @peter and @tryl. I’ve got renewed interest in contributing to Mapillary on foot, as many of the local roads are covered. Walking and hiking would be a fun way to contribute. I’ve done some ‘walking around holding the iPhone’ mode but I’d like to try something like this set up.

If I could replicate the Google Trekker rig I would. However, I am curious if consumer 360 cams have improved since 2016. It appears that the GoPro Fusion 360 takes photos at 5.6K (5.6 x Ricoh Theta S) and the new Theta Z1 goes to 6+K. Anyone doing pole-mounted 360 with these newer cams in 2019?

I’ve done a bit of pole mounted walking with a Fusion, but there are surely more elaborate setups around. Don’t expect much from consumer 360 cameras still - zoomed out images look ok (especially on the Theta), however detail is still very much not there

1 Like

I used Ricoh Theta S untill mine died, then Xiaomi Mi Sphere. The latter can do roughly 20 mega pixels and when stitching outside the camera it can take an image ever about 2.5 sec. Every 8 sec if you shoot raw.
I get the best stitching result using the Android app https://play.google.com/store/apps/details?id=com.hirota41.misphereconverter&showAllReviews=true . It is relatively expensive, and it is a bit of a pain when stitching many images, but it stitches the images pretty much perfect and at least on par with Ricoh.
Best of all: The camera is pretty cheap.

You can see my images around Aarhus, Denmark, e.g. Mapillary which is on bicycle.

I use an angled USB cable for providing power for longer trips.

Take a look at “Hugin

It took some work (since there wasn’t a “PTO” config file around of my camera) but the results are (near) perfect!

And Hugin doesn’t cost a thing :wink:

I will try this https://gist.github.com/RadhiFadlillah/ab8d338714e3f0dfc887798e628a7fa6 one of the days :slight_smile:

1 Like

If you’re handy with command line (this is what I do under Linux (in my perl script)

your PTO has:

n"image.jpg"

Thus, the source file should be named ‘image.jpg’

In my script xxx_0.jpg are the files that should get stitched
and the xxxxxx_1.jpg are the files that are stitched:

$Template = 'template.pto';

if (!(-d $Directory.'/bak')) {
  print exec_cmd('mkdir ./bak','mkdir '.$Directory.'/bak');
}
opendir (DIR, $Directory) || die "Error while opening $Directory: $!\n";
foreach my $File(sort readdir DIR) {
    if($File =~ /.*?_0\.jpg$/i ) {
      my $Target = $File;
      $Target =~ s/_0\.jpg$/_1\.jpg/;
      copy($Directory.'/'.$File
          ,'./image.jpg');
      my $output = &exec_cmd('stitch','hugin_executor --stitching --prefix='.$Target.' '.$Template);
      if (index($output,'1 image files updated') == -1 ) {
        print $output;
        print "\n=============== Error? ===============\n";
        exit;
      } else {
        move('./'.$Target
            ,$Directory.'/'.$Target);
        unlink($Directory.'/'.$File);
      }
    }
    elsif($File =~ /\.jpg$/i
     &&  !($File =~ /_1\.jpg$/i)) {
      move($Directory.'/'.$File
          ,$Directory.'/bak/'.$File);
    }

  }
 sub exec_cmd() {
	my ($desc,$cmd) = @_;
	$desc = "\n".$desc;
	$desc .= ": ";
	$desc .= $cmd.":";
	my $output = `$cmd`;
	$desc .= "Command exit string :".$output." returnstring=".$?;#."\n";
	return $output;
}
2 Likes

would you post your PTO file. The one I found gave a reasonable result, but with a bit too many errors in the edges.

Does your raw file look exactly like mine? (check: first post)

If so, you could try… (link in post 11)
You could also try to improve the PTO you got and add extra control points (in tab “control points”)

1 Like