This shows you the differences between two versions of the page.
photo:tilt-shift [2009/11/15 08:21] ben created |
photo:tilt-shift [2010/03/06 01:54] (current) ben |
||
---|---|---|---|
Line 1: | Line 1: | ||
For now, I just wanted to note that if a site were created to edit someone's video, it would make sense to upload the images and process them in a RAM disk on the server, processing will be much faster that way. | For now, I just wanted to note that if a site were created to edit someone's video, it would make sense to upload the images and process them in a RAM disk on the server, processing will be much faster that way. | ||
+ | |||
+ | ====== Tilt-shift a video file with ImageMagick ====== | ||
+ | |||
+ | -dump video to image files. | ||
+ | -create a mask. | ||
+ | -create a set of blurred images. | ||
+ | -create a set of composite images created from the blurs with the mask. | ||
+ | -recombine images to video file. | ||
+ | |||
+ | Steps: | ||
+ | |||
+ | -mplayer -vo jpeg myfile.mov (or mplayer -vo png:z=0 -ao pcm:file=file.wav file) | ||
+ | -convert -threshold 100% 00001.jpg -fill white -draw 'ellipse 160,160 300,40 0,360' -gaussian 35x35 +matte circle_mask.jpg;display circle_mask.jpg | ||
+ | -for i in *.jpg;do convert -gaussian 3x3 $i blur/$i;done | ||
+ | -for i in cropped*.jpg;do composite $i blur/$i circle_mask.jpg out/$i;done | ||
+ | -mencoder "mf:\/\/out\/cropped*.jpg" -mf fps=24 -o blur_output.avi -ovc lavc -lavcopts vcodec=mpeg4 \\ | ||
+ | |||
+ | |||
+ | That's it. | ||
+ | |||
+ | "That's it" nice. not quite- | ||
+ | |||
+ | To get better results, a simple ellipse just isn't appropriate. what is better may be a rotated ellipse. To get a rotated ellipse, SVG drawing is necessary. | ||
+ | |||
+ | M: move abosolute | ||
+ | Z: end path | ||
+ | A: draw an Arc | ||
+ | |||
+ | Specs are here: http://www.w3.org/TR/SVG/paths.html#PathDataGeneralInformation | ||
+ | |||
+ | something that is close: | ||
+ | |||
+ | convert -threshold 100% koytmp/00000600.png -fill white -draw "path 'M 330,240 A 45,5 187 1,0 340,320 A 45,5 187 0,0 330,240 Z '" -depth 8 -gaussian 35x35 +matte circle_mask.png;display circle_mask.png | ||
+ | |||
+ | A values: | ||
+ | 45,5 = radii | ||
+ | 187 = angle of rotation | ||
+ | 1,0 = sweep and some other shit, not so important | ||
+ | 340,320 = endpoint x,y | ||
+ | |||
+ | |||
+ | Another very decent shape: | ||
+ | |||
+ | convert -threshold 100% koytmp/00000600.png -fill white -draw "path 'M 352,340 A 10,1 187 1,1 350,260 A 10,1 187 1,1 352,340 Z '" -depth 8 +matte circle_mask.png;display circle_mask.png | ||
+ | convert -threshold 100% koytmp/00000600.png -fill white -draw "path 'M 352,340 A 10,1 187 1,1 350,220 A 10,1 187 1,1 352,340 Z '" -depth 8 +matte circle_mask.png | ||
+ | |||
+ | Less blur worked better, 3x3 gauss on Koyaanisqatsi video... | ||
+ | |||
+ | |||
+ | To extract audio: | ||
+ | |||
+ | mplayer -vc null -vo null -ss 2700 -frames 300 -ao pcm:file=koy300.wav Koyaanisqatsi.mkv - frames doesn't seem to stop the dump at the appropriate place. is there an end seconds arg? | ||
+ | mplayer -vc null -vo null -ss 2700 -endpos 300 -ao pcm:file=koy300.wav Koyaanisqatsi.mkv | ||
+ | |||
+ | endpos arg note in the man page: When used in conjunction with -ss option, -endpos time will shift forward by seconds specified with -ss. | ||
+ | i.e. subtract ss from the absolute number of seconds for your end time. | ||
+ | |||
+ | Can't seem to combine, mplayer can at least play this one: | ||
+ | |||
+ | encoder "mf://out/*.png" -mf fps=24 -o koytest2.avi -audiofile koy300.wav -oac lavc -lavcopts acodec=mp2 -ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=2400 | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Bezier's instead? | ||
+ | |||
+ | convert -threshold 100% train1.png -fill white -draw "path 'M100,200 C100,100 400,100 400,200 C400,300 100,300 100,200'" -depth 8 -gaussian 15x15 +matte circle_mask.png;display circle_mask.png | ||
+ | |||
+ | M is the starting point. First C field is first bezier control point, second field is second bezier control point, 3rd C field is the end point. So above, 100,200 is start, 100,200 is end, and 4 control points result in a nice ellipse in the center of an image 500x365px. | ||
+ | |||
+ | This one results in a tilted ellipse, changes of -80 in x value on top, +80 in x value below: | ||
+ | |||
+ | convert -threshold 100% train1.png -fill white -draw "path 'M100,200 C20,100 320,100 400,200 C480,300 180,300 100,200'" -depth 8 -gaussian 15x15 +matte circle_mask.png;display circle_mask.png | ||
+ | convert -threshold 100% train1.png -fill white -draw "path 'M50,200 C20,80 320,80 500,200 C420,300 180,300 50,200'" -depth 8 -gaussian 35x35 +matte circle_mask.png;display circle_mask.png | ||
+ | |||
+ | The second give a shapelier sort of shape. | ||
+ | |||
+ | Decent results on file "P1030435.jpg" with- 5x5 gauss blur, mask of path "'M-300,1050 C-10,500 1600,300 1520,300 C1600,700 400,1000 180,1400'", mask blur gauss 25x25, and finally -contrast-stretch 1600x1038 -modulate 100,150,100 on the file output. | ||
+ | |||
+ | {{:p1030435sm.jpg?600|result}} | ||
+ | {{:p1030435sm_circle_mask_sm.jpg?600|mask}} | ||
+ | |||
+ | Would like to try changing the mask to inverted- let the background be in focus, the foreground out. | ||
+ | |||
+ | More decent results with: | ||
+ | convert -threshold 100% test.jpg -fill white -draw "path 'M100,1000 C200,600 1600,-200 1400,-200 C1400,700 400,1000 100,1000'" -depth 8 -gaussian 25x25 +matte circle_mask.jpg;open circle_mask.jpg | ||
+ | and | ||
+ | convert -quality 100 -modulate 115,140,100 output.jpg outputhigh.jpg;open outputhigh.jpg & | ||
+ | |||
+ | {{:p1030435sm2.jpg?600|}} | ||
+ | {{:p130435sm_circle_mask_sm2.jpg?600|}} | ||
+ | |||
+ | |||
+ | Contrast- -contrast increases, +contrast decreases... can apply to different channels as well, need to do more reading. This one was interesting on the above image: | ||
+ | convert -quality 100 -modulate 105,160,100 +contrast output.jpg outputhigh.jpg;open outputhigh.jpg | ||
+ | |||
+ | Not bad: | ||
+ | convert -threshold 100% test.jpg -fill white -draw "path 'M-100,-150 C200,200 1400,600 1800,1000 C1800,1600 400,600 -100,100'" -depth 8 -gaussian 1x1 +matte circle_mask.jpg;open circle_mask.jpg | ||
+ | convert -gaussian 25x25 circle_mask.jpg circle_mask.jpg | ||
+ | composite test.jpg testblur.jpg circle_mask.jpg output.jpg;open output.jpg & | ||
+ | convert -quality 100 -modulate 110,160,100 output.jpg outputhigh.jpg;open outputhigh.jpg | ||
+ | |||
+ | {{:outputhigh.jpg?900|}} | ||
+ | {{:circle_mask.jpg?900|}} | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ |