Jon VolkmarJekyll v3.10.0https://jonvolkmar.com/apple-touch-icon-precomposed.pngJon Volkmar's portfolio, blog, and personal website2024-12-12T23:41:05+00:00https://jonvolkmar.com/https://jonvolkmar.com/HTML5 Canvas Memory Game2015-10-11T00:00:00+00:00https://jonvolkmar.com/portfolio/html5-canvas-memory-gamehttps://jonvolkmar.com/
<p>This is a little memory tiles game that is programmed in CoffeeScript and uses the HTML5 canvas API for simple 2D rendering and animations. It was originally made in a hackathon designed to interact with an Arduino robot - if you won the game, the robot would do a little dance. Unfortunately I do not have a video of the dancing robot. The code is up on my <a href="https://github.com/j-v/edubots-memory">GitHub</a>.</p>
<p>The object of the game is to flip over matching pairs of tiles until all the tiles are flipped over.</p>
<div id="canvasDiv" class="float-left">
<canvas id="myCanvas" width="870" height="700"></canvas>
</div>
Pyro - The Anti-Social Game Where the Object is to Burn Down a Forest2015-09-28T00:00:00+00:00https://jonvolkmar.com/portfolio/pyrohttps://jonvolkmar.com/
<p>Pyro was developed by myself, <a href="http://claudiagoldberg.com">Claudia Goldberg</a>, and <a href="http://mdehdashti.com">Mehrdad Dehdashti</a> during a hackathon in January, 2012. The game invites you to attempt to burn down a forest by clicking on trees and watching the fire spread. This version is a prototype - the gameplay aspects are not anywhere near polished - but there is something perversely satisfying in watching a the pixelated trees burn in front of your eyes.</p>
<p>Pyro is programmed in CoffeeScript and uses the HTML5 Canvas control. The code is up on <a href="https://github.com/j-v/PYRO">GitHub</a>.</p>
<p>You can try it out below. Note that there may be some glitches when playing on your phone or tablet.</p>
<div id="container">
<div id="pyro-main" role="main" class="section">
<header>
<h1>PYRO: <span>The Environmentally-Unfriendly, Anti-Social Game</span></h1>
</header> <!-- end header -->
<aside class="float-left">
<ul>
<li class="large button" id="about">
<a href="#">About</a>
</li>
<li class="large button" id="regrow">
<a href="#">Regrow Map</a>
</li>
<li class="large button" id="randomize">
<a href="#">Random Map</a>
</li>
<li class="large button" id="burn">
<a href="#">BURN IT ALL!</a>
</li>
</ul>
</aside> <!-- end aside -->
<div id="canvasDiv" class="float-left">
<canvas id="myCanvas" width="800" height="400"></canvas>
<div class="progressBar" style="width:800px;height:20px;background:white;">
<div class="progressBarMeter" style="width:0px;height:16px;background:red;"></div>
</div>
</div>
<div class="clear"></div>
</div> <!-- end #main -->
</div>
<p><!-- end #container --></p>
<div id="hiddenModalContent" class="TB_modal" style="display:none">
<p>Start a forest fire by clicking on a tree <div style="width:25px;height:25px;overflow:hidden;"><img src="/images/pyro/tree.png" /></img></div></p>
<p>Trees next to water can grow back, watch out for them!</p>
<p>Strategize and scheme to burn down the forest with the least moves possible</p>
<p>...or, for instant gratification, take a look at that button on the bottom left.<p>
<p>Pyro was developed by <a href="http://claudiagoldberg.com/">Claudia Goldberg</a>, <a href="http://jonvolkmar.com">Jon Volkmar</a>, and <a href="http://mdehdashti.com">Mehrdad Dehdashti</a></p>
<p>Copyright 2012</p>
<div class="modal button">
<a href="#" type="submit" id="Login" onclick="tb_remove()">Okay</a>
</div> <!-- end .modal.button -->
</div>
</div> <!-- end #hiddenModalContent -->
</p></p></div>
FaceBulge - Make Faces Pop!2015-09-28T00:00:00+00:00https://jonvolkmar.com/portfolio/facebulgehttps://jonvolkmar.com/
<p><a href="http://facebulge.jonvolkmar.com">FaceBulge</a> is a hack created by Jon Volkmar, José Tomás Albornoz, Daniel Snider, and Tina Yang. Submit an image containing one or more faces, and FaceBulge will use our special algorithm make them bulge! It may not work as expected on mobile platforms.</p>
<p><img src="/images/facebulge/facebulge-ballmer.gif" alt="A bulged Steve Ballmer" /></p>
<p>We used face detection algorithms from OpenCV on the backend, WebGL for 3d graphics on the frontend, and Node.js as our web framework.</p>
<p>Our code is on GitHub: <a href="https://github.com/j-v/FaceBulge">https://github.com/j-v/FaceBulge</a></p>
Content-Based Image Retrieval Using the Earth Mover's Distance Algorithm2015-09-20T00:00:00+00:00https://jonvolkmar.com/portfolio/image-retrieval-earth-movers-distancehttps://jonvolkmar.com/
<p>As a course project during my time at Freie Universität Berlin, my teammate Martí Griera Jorba and I experimented with various algorithms relating to shape matching and feature extraction in images. The project was coded in C++, making extensive use of the <a href="http://opencv.org/">OpenCV</a> library for computer vision. The image below illustrates some of the algorithms we used to extract features from input images, resulting in a representation of the image as a weighted point set.</p>
<p><img src="/images/emd/pointset-method.png" alt=" Feature extraction algorithms " /></p>
<p><em>Data from edge detection done using the Canny algorithm, corner detection using the MinEigenVal algorithm, and the intensity gradient computed using the Sobel operator were combined to generate the resultant point set. We used OpenCV implementations of all three algorithms.</em></p>
<p>To compare the weighted point sets, we used the <a href="https://en.wikipedia.org/wiki/Earth_mover%27s_distance">Earth Mover’s Distance</a> (EMD) algorithm, as implemented by <a href="http://ai.stanford.edu/~rubner/emd/default.htm">Yossi Rubner</a>.</p>
<p><img src="/images/emd/ray-emd-vis.png" alt=" Images of a ray compared using EMD " /></p>
<p><em>Visualization of EMD computed on two images of simple shapes. Larger points indicated larger weights, and thicker lines indicate higher flow between points</em></p>
<p>With the feature extraction and comparison algorithms in place, we can query a database of images, and retrieve the closest matches.</p>
<p><img src="/images/emd/simple-shapes-queries.png" alt=" Simple shape matches " /></p>
<p><em>Closest matches to the query image, as reported by our EMD comparison engine. Dataset: <a href="http://www.lems.brown.edu/vision/researchAreas/SIID/">Brown Shape Indexing of Images Database (SIID)</a></em></p>
<p>The EMD image retrieval engine effectively returns matches for a database of simple images, such as the dataset of silhouettes shown above. For more complex datasets, the results are… mixed.</p>
<p><img src="/images/emd/categories-queries.png" alt=" Matches from the Caltec 101 Categories Dataset " /></p>
<p><em>Image retrieval results of a larger, more complex dataset. Dataset: 500 image subset of the <a href="http://www.vision.caltech.edu/Image_Datasets/Caltech101/">Caltec 101 Categories Dataset</a></em></p>
<p>It can be interesting to visualize an image database globally to examine the computed similarities of the images. We did this using a <a href="https://en.wikipedia.org/wiki/Multidimensional_scaling">multidimensional scaling</a> algorithm, which plots each image into 3D space. Images which are computed to be most similar to each other wind up closest to each other in the 3D space. We used the freely available <a href="http://algo.uni-konstanz.de/software/mdsj/">MDSJ - Multidimensional Scaling for Java</a> library, and created a 3D visualization using <a href="https://processing.org/">Processing</a>.</p>
<p><img src="/images/emd/mdsvis1.png" alt=" Visualizing image similarities using multidimensional scaling " /></p>
<p><em>The SIID image dataset visualized in 3D space. Each image class is given a different color. Images nearest to eachother in 3D space are most similar as computed by EMD.</em></p>
Real-Time Velocity Field Estimation with Kinect2015-08-23T00:00:00+00:00https://jonvolkmar.com/portfolio/kinect-real-time-velocity-field-estimationhttps://jonvolkmar.com/
<p>As part of McGill course COMP558 - Fundamentals of Computer Vision, my teammate Beomjoon Kim and I used a Kinect sensor
and the “optical flow” algorithm from OpenCV to obtain a velocity field of the sensor’s surroundings. The intended application
is for a autonomous robot to be able to detect the flow of pedestrian traffic around it, in order to aid it in navigation.</p>
<iframe width="420" height="315" src="https://www.youtube.com/embed/vdfnYbsoZQs" frameborder="0" allowfullscreen=""></iframe>
<p>The implementation is coded in C++, and the computations are performed in real-time.</p>
Famous Faces - An Experiment in Quad-Trees and Image Processing2015-08-23T00:00:00+00:00https://jonvolkmar.com/portfolio/famous-faceshttps://jonvolkmar.com/
<p>Famous faces are amongst the most recognizable subjects to human eyes, but what happens when photos of famous faces are mangled using algorithms that re-imagine their composition?</p>
<p>Image processing is done using my custom-made <a href="https://github.com/j-v/ImageMirage">ImageMirage</a> Python scripts. The ImageMirage algorithms break up images into rectangular regions based on color, then replace the regions with snipped images of roughly similar colors. The effect is a dazzling mosaic of disparate subjects, but the original famous face is still quite recognizable.</p>
<p>Find <a href="https://github.com/j-v/ImageMirage">ImageMirage on GitHub</a>.</p>
<p><strong>Clinton Series</strong></p>
<p><img src="/images/famousfaces/clinton_orig.jpeg" alt=" Original Clinton " /></p>
<p><img src="/images/famousfaces/clinton1.jpg" alt=" Clinton processed with image bank 1 " /></p>
<p><img src="/images/famousfaces/clinton2.jpg" alt=" Clinton processed with image bank 2 " /></p>
<p><img src="/images/famousfaces/clinton3.jpg" alt=" Clinton processed with image bank 3 " /></p>
<p><strong>Jesus Series</strong></p>
<p><img src="/images/famousfaces/jesus_orig.jpg" alt=" Original Jesus " /></p>
<p><img src="/images/famousfaces/jesus1.jpg" alt=" Jesus processed with image bank 1 " /></p>
<p><img src="/images/famousfaces/jesus2.jpg" alt=" Jesus processed with image bank 2 " /></p>
<p><img src="/images/famousfaces/jesus3.jpg" alt=" Jesus processed with image bank 3 " /></p>
<p><strong>Mona Series</strong></p>
<p><img src="/images/famousfaces/mona_orig.jpg" alt=" Original Mona " /></p>
<p><img src="/images/famousfaces/mona1.jpg" alt=" Mona processed with image bank 1 " /></p>
<p><img src="/images/famousfaces/mona2.jpg" alt=" Mona processed with image bank 2 " /></p>
<p><img src="/images/famousfaces/mona3.jpg" alt=" Mona processed with image bank 3 " /></p>