Mercurial > lasercutter
view src/clojureDemo/VideoTransforms.clj @ 6:4ae2497acf7d
saving progress
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Fri, 20 Aug 2010 03:18:05 -0400 |
parents | 6d9bdaf919f7 |
children |
line wrap: on
line source
1 (ns clojureDemo.VideoTransforms)3 (import '(java.awt Rectangle Robot Toolkit) )4 (import '(java.awt.image BufferedImage) )5 (import '(java.awt Graphics2D Panel))6 (import '(java.io File) )7 (import '(javax.imageio ImageIO) )8 (import '(javax.swing JFrame))9 (import '(org.apache.commons.io FileUtils))10 (import clojure.lang.LazySeq)11 (import '(name.audet.samuel.javacv.jna highgui cv cxcore))12 (import '(name.audet.samuel.javacv CanvasFrame))13 (import '(name.audet.samuel.javacv.jna cxcore$IplImage))14 (import '(name.audet.samuel.javacv.jna highgui$CvCapture$PointerByReference))15 (import '(name.audet.samuel.javacv.jna highgui$CvVideoWriter$PointerByReference))16 (import '(name.audet.samuel.javacv.jna cxcore$IplImage$PointerByReference))17 (import '(name.audet.samuel.javacv.jna cxcore$IplImage))18 (import '(name.audet.samuel.javacv JavaCvErrorCallback))20 (.redirectError (JavaCvErrorCallback.));this enables the c errors to travel up to the JVM21 ;where they can be handled.24 (use '[clojureDemo.VisionCore :only (video-seq cache video-data close-writer)])27 (use 'clojure.contrib.repl-utils)29 (def -inf Double/NEGATIVE_INFINITY)30 (def inf Double/POSITIVE_INFINITY)33 (def lian (File. "/home/r/Desktop/source-videos/lian1.mpeg"))34 (def look (File. "/home/r/Desktop/source-videos/dramatic_look.flv"))35 (def getto(File. "/home/r/Desktop/source-videos/Ghetto.flv"))36 (def human0(File. "/home/r/Desktop/source-videos/vsr1/human0.avi"))38 (def base (File. "/home/r/Desktop/source-videos/"))40 (def app0 (File. base "approach0v2.avi"))41 (def app1 (File. base "approach1v3.avi"))42 (def app2 (File. base "approach0v3.avi"))43 (def app3 (File. base "approach2v2.avi"))44 (def app4 (File. base "approach1v2.avi"))45 (def app5 (File. base "approach2v3.avi"))47 (def bounce0 (File. base "bounce0v2.avi"))48 (def bounce1 (File. base "bounce1v3.avi"))49 (def bounce2 (File. base "bounce3v2.avi"))50 (def bounce3 (File. base "bounce0v3.avi"))51 (def bounce4 (File. base "bounce2v2.avi"))52 (def bounce5 (File. base "bounce1v2.avi"))53 (def bounce6 (File. base "bounce2v3.avi"))55 (def collide0 (File. base "collide0v3.avi"))56 (def collide1 (File. base "collide2v3.avi"))57 (def collide2 (File. base "collide1v2.avi"))58 (def collide3 (File. base "collide0v2.avi"))59 (def collide4 (File. base "collide1v3.avi"))61 (def give0 (File. base "give0v3.avi"))62 (def give1 (File. base "give2v3.avi"))63 (def give2 (File. base "give1v2.avi"))64 (def give3 (File. base "give0v2.avi"))65 (def give4 (File. base "give1v3.avi"))68 (def target (File. "/home/r/Desktop/output-vision/"))69 (def default(File. target "default.avi"))70 (defn- makePanel [image] (proxy [Panel] [] (paint [g] (.drawImage g image 0 0 nil))))72 (defmulti display "Creates a JFrame and displays a buffered image" class)74 (defmethod display75 BufferedImage [image]76 (let [panel (makePanel image)77 frame (JFrame. "Oh Yeah!")]78 (.add frame panel)79 (.pack frame)80 (.setVisible frame true )81 (.setSize frame(.getWidth image) (.getHeight image))))83 (defmethod display84 cxcore$IplImage [image]85 ( display (.getBufferedImage image)))87 (defmethod display88 String [image]89 (display (highgui/cvLoadImage image highgui/CV_LOAD_IMAGE_COLOR)))91 (defmethod display92 LazySeq [s]93 (display (first s)))96 (defn video-writer97 "uses data about the video to make a writer"98 [data fileTarget]99 (highgui/cvCreateVideoWriter100 (str fileTarget)102 ;(highgui/CV_FOURCC \P,\I,\M,\1) ;= MPEG-1 codec (112913.386195 msecs) (104 MB)103 ;(highgui/CV_FOURCC \M,\J,\P,\G) ;= motion-jpeg codec (crashed)104 ;(highgui/CV_FOURCC \M,\P,\4,\2) ;= MPEG-4.2 codec (107184.186774 msecs) (82 MB)105 ;(highgui/CV_FOURCC \D,\I,\V,\3) ;= MPEG-4.3 codec (118308.933328 msecs) (83 MB)106 ;;(highgui/CV_FOURCC \D,\I,\V,\X) ;= MPEG-4 codec (99037.738131 msecs) (85 MB)107 (highgui/CV_FOURCC \H,\D,\Y,\C)108 ;(highgui/CV_FOURCC \U,\2,\6,\3) ;= H263 codec (101141.993551 msecs) (89 MB)109 ;(highgui/CV_FOURCC \I,\2,\6,\3) ;= H263I codec (crashed)110 ;(highgui/CV_FOURCC \F,\L,\V,\1) ;= FLV1 codec (104307.567802 msecs) (93 MB)111 ;(:codec data) ;= whatever the movie originally had. (98278.694169 msecs) (1.9 GB)113 (:fps data) (cxcore/cvSize (:width data) (:height data))114 1; 1 here means that we're writing in color.115 ; you cannot change it to 0 to write in116 ; black and white. Everything just crashes instead.117 ; what a useful paramater.118 ))121 (defn naturals [] (iterate inc 0))124 (defn write-frame125 [writer frame]126 (do127 (highgui/cvWriteFrame writer frame)128 frame))130 (defn number-seq131 [video-seq]132 (map #(vector %1 %2) (naturals) video-seq))134 (defn save-seq135 [writer video-seq]136 (map #(write-frame writer %) video-seq))138 (defn create-runonce [function]139 (let [sentinel (Object.)140 result (atom sentinel)]141 (fn [& args]142 (locking sentinel143 (if (= @result sentinel)144 (reset! result (function))145 @result)))))147 (defmacro oncer148 [video-seq-gen]149 `((create-runonce #(~@video-seq-gen))))151 (defmacro trans-save152 "there's a small problem with trans-save --- it IS153 truly transitive, but it does too much work....154 sometimes it writes files twice.155 this is functionally correct though."156 [target config video-seq]157 `(let [writer# (video-writer ~config ~target)]158 (do159 (dorun (save-seq writer# ~video-seq))160 (close-writer writer#)161 ~video-seq)))163 (defn save-video164 [video target]165 (let [writer (video-writer (video-data video) target)]166 (do167 (dorun (map #(write-frame writer %) (video-seq video)))168 (close-writer writer))))171 (comment (Examples of things you can try that will actually work)173 (def lazy-human (video-seq human0)) ;makes a lazy sequence of frames and returns instantly.174 (def target1 (File. "some/path/out1.avi")) ;just creates a normal Java File object.175 (def target2 (File. "some/other/path/out2.avi"))176 (def human0-data (video-data human0)) ;creates a map containing the fps, width, and height of the video.178 (trans-save target human0-data (video-seq human0))179 ;saves a copy of human0 to disk.181 (trans-save target2 human0-data (video-seq-filter (trans-save target1 human0-data (video-seq human0))))182 ;saves an unaltered copy of human0 to disk, filters the sequence of183 ;Intel Processing Library images by video-seq-filter, and writes the184 ;filtered result to disk. video-seq-filter could discard every other frame,185 ;take the sequence by fives and do temporal blurring, or just turn every186 ;frame to black and white.189 (do (use :reload-all 'clojureDemo.VideoTransforms) (in-ns 'clojureDemo.VideoTransforms))191 )