PageSourceSearch

https://packet39.com/projects/augmented-reality-tennis/

html packet39.com collected 2026-09-26 00:41:49 UTC 36,371 bytes, 4 lines download raw bytes

1<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"/><meta charSet="utf-8"/><link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png"/><link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png"/><link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png"/><link rel="shortcut icon" type="image/png" href="/favicons/favicon-32x32.png"/><title>Augmented Reality tennis app | Packet39</title><meta itemProp="name" content="Augmented Reality tennis app | Packet39"/><meta property="og:title" content="Augmented Reality tennis app | Packet39"/><meta name="description" content="We developed a mobile AR app capable of detecting and tracking a tennis court, and visualizing ball trajectories. It displays shot details such as speed, h"/><meta itemProp="description" content="We developed a mobile AR app capable of detecting and tracking a tennis court, and visualizing ball trajectories. It displays shot details such as speed, h"/><meta property="og:description" content="We developed a mobile AR app capable of detecting and tracking a tennis court, and visualizing ball trajectories. It displays shot details such as speed, h"/><meta itemProp="image" content="https://packet39.com/uploads/screenshot-2025-04-27-115123.png"/><meta property="og:image" content="https://packet39.com/uploads/screenshot-2025-04-27-115123.png"/><meta property="og:url" content="https://packet39.com/projects/augmented-reality-tennis/"/><meta name="twitter:card" content="summary"/><meta name="twitter:site" content="@vice_packet39"/><meta property="og:site_name" content="Packet39"/><link rel="preload" as="image" imageSrcSet="/_next/static/chunks/images/uploads/packet39-logo-horiz-golds_64_75.png 64w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_128_75.png 128w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_320_75.png 320w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_640_75.png 640w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_960_75.png 960w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_1280_75.png 1280w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_1600_75.png 1600w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_1920_75.png 1920w" imageSizes="100vw"/><meta name="next-head-count" content="19"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="true"/><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /><link rel="preload" href="/_next/static/css/adec5ad4c7d6273b.css" as="style"/><link rel="stylesheet" href="/_next/static/css/adec5ad4c7d6273b.css" data-n-g=""/><link rel="preload" href="/_next/static/css/ae4ed9c503fd1e33.css" as="style"/><link rel="stylesheet" href="/_next/static/css/ae4ed9c503fd1e33.css" data-n-p=""/><noscript data-n-css=""></noscript>
1<script defer="" nomodule="" src="/_next/static/chunks/polyfills-5cd94c89d3acac5f.js"></script>
1<script src="/_next/static/chunks/webpack-db164ab6b70886ef.js" defer=""></script>
1<script src="/_next/static/chunks/framework-a87821de553db91d.js" defer=""></script>
1<script src="/_next/static/chunks/main-fbdd165dda4726b7.js" defer=""></script>
1<script src="/_next/static/chunks/pages/_app-0646eb2a8d339346.js" defer=""></script>
1<script src="/_next/static/chunks/760-285b9be4f6812686.js" defer=""></script>
1<script src="/_next/static/chunks/446-e3cbfbad6d390451.js" defer=""></script>
1<script src="/_next/static/chunks/303-6c61cfb96e845cc1.js" defer=""></script>
1<script src="/_next/static/chunks/pages/projects/%5Bslug%5D-c5eecf4f8b63b2fe.js" defer=""></script>
1<script src="/_next/static/oTISGQL3YQAPk1kRT3Yk6/_buildManifest.js" defer=""></script>
1<script src="/_next/static/oTISGQL3YQAPk1kRT3Yk6/_ssgManifest.js" defer=""></script>
1<script src="/_next/static/oTISGQL3YQAPk1kRT3Yk6/_middlewareManifest.js" defer=""></script>
1<style data-href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap">@font-face{font-family:'Montserrat';font-style:italic;font-weight:100;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R8aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:200;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR9aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq_p9aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq6R9aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq5Z9aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:600;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq3p6aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jq0N6aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:800;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqyR6aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUFjIg1_i6t8kCHKm459Wx7xQYXK0vOoz6jqw16aXw&skey=2d3c1187d5eede0f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:100;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Uw9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:200;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr6Ew9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:300;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCs16Ew9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:400;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Ew9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:500;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtZ6Ew9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:600;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCu170w9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:700;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM70w9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:800;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvr70w9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:normal;font-weight:900;font-display:swap;src:url(https://fonts.gstatic.com/l/font?kit=JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCvC70w9&skey=7bc19f711c0de8f&v=v31) format('woff')}@font-face{font-family:'Montserrat';font-style:italic;font-weight:100 900;font-display:swap;
1src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUQjIg1_i6t8kCHKm459WxRxC7m0dR9pBOi.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Montserrat';font-style:italic;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUQjIg1_i6t8kCHKm459WxRzS7m0dR9pBOi.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Montserrat';font-style:italic;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUQjIg1_i6t8kCHKm459WxRxi7m0dR9pBOi.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Montserrat';font-style:italic;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUQjIg1_i6t8kCHKm459WxRxy7m0dR9pBOi.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Montserrat';font-style:italic;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUQjIg1_i6t8kCHKm459WxRyS7m0dR9pA.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:'Montserrat';font-style:normal;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUSjIg1_i6t8kCHKm459WRhyyTh89ZNpQ.woff2) format('woff2');unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:'Montserrat';font-style:normal;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUSjIg1_i6t8kCHKm459W1hyyTh89ZNpQ.woff2) format('woff2');unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:'Montserrat';font-style:normal;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUSjIg1_i6t8kCHKm459WZhyyTh89ZNpQ.woff2) format('woff2');unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:'Montserrat';font-style:normal;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUSjIg1_i6t8kCHKm459WdhyyTh89ZNpQ.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:'Montserrat';font-style:normal;font-weight:100 900;font-display:swap;src:url(https://fonts.gstatic.com/s/montserrat/v31/JTUSjIg1_i6t8kCHKm459WlhyyTh89Y.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}</style></head><body><div id="__next"><div class="flex flex-col h-screen"><div class="relative"><header class="flex items-start justify-center fixed z-50 w-full"><div class="w-full relative bg-gradient-to-b via-black/65 from-black pb-3"><nav class="w-full max-w-7xl mx-auto px-4 sm:px-6 md:px-8 p-2 text-2xl text-white" aria-label="Top"><div class="w-full flex items-center justify-between"><a class="mr-8 logo block relative h-12 w-32 lg:h-16 lg:w-48" href="/"><span class="sr-only">Workflow</span><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img alt="Packet39" sizes="100vw" srcSet="/_next/static/chunks/images/uploads/packet39-logo-horiz-golds_64_75.png 64w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_128_75.png 128w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_320_75.png 320w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_640_75.png 640w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_960_75.png 960w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_1280_75.png 1280w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_1600_75.png 1600w, /_next/static/chunks/images/uploads/packet39-logo-horiz-golds_1920_7
15.png 1920w" src="/_next/static/chunks/images/uploads/packet39-logo-horiz-golds_1920_75.png" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain;object-position:left center"/></span></a><div class="hidden space-x-8 lg:block"><a class="text-white hover:text-brand text-base font-bold uppercase" href="/">Home</a><a class="text-white hover:text-brand text-base font-bold uppercase" href="/#about">About Us</a><a class="text-white hover:text-brand text-base font-bold uppercase" href="/#projects">Projects</a><a class="text-white hover:text-brand text-base font-bold uppercase" href="/blog/">Blog</a></div><div class="ml-10 space-x-4"><a class="hidden lg:inline-block button bg-brand lg:py-2 lg:px-8 border border-transparent rounded-full text-sm lg:text-base whitespace-nowrap font-medium text-brand-grey hover:bg-brand-dark hover:text-white" href="/#contact">Contact Us</a><div class="lg:hidden"><button class="bg-brand rounded-full p-2 inline-flex items-center justify-center text-brand-grey hover:text-white hover:bg-brand-dark focus:outline-none focus:ring-2 focus:ring-inset focus:ring-brand" id="headlessui-popover-button-:Rlm:" type="button" aria-expanded="false"><span class="sr-only">Open menu</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true" class="h-6 w-6"><path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"></path></svg></button></div></div></div></nav></div></header></div><main class="flex-grow"><div class="overflow-hidden flex pt-32 pb-24 relative"><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img alt="" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:cover"/><noscript><img alt="" sizes="100vw" srcSet="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_64_75.png 64w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_128_75.png 128w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_320_75.png 320w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_640_75.png 640w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_960_75.png 960w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_1280_75.png 1280w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_1600_75.png 1600w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_1920_75.png 1920w" src="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_1920_75.png" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:cover" loading="lazy"/></noscript></span><div class="absolute inset-0 bg-gradient-to-r from-brand-grey to-brand-darkest mix-blend-multiply" aria-hidden="true"></div><div class="relative w-full max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 p-5 text-2xl text-white"><div class="text-lg"><p class="text-base text-brand-dark tracking-wide uppercase">Project</p><h1 class="mt-3 text-3xl font-extrabold text-white">Augmented Reality Tennis</h1><div class="mt-12 flex space-x-12"><div><p class="text-base text-brand-dark tracking-wide uppercase">Technologies</p><h2 class="block text-l font-semibold text-brand-grey-lightest">Unity, AR, OpenCV</h2></div></div></div></div></div><div class="relative py-16 bg-white overflow-hidden"><div class="relative px-4 sm:px-6 lg:px-8 mx-auto max-w-7xl"><div class="mt-6 prose prose-brand prose-base prose-a:text-brand prose-a:no-underline hover:prose-a:text-brand-dark text-brand-grey mx-auto"><div class="carousel-root not-prose"><div class="carousel carousel-slider" style="width:100%"><button class="absolute top-1/2 -translate-y-1/2 left-0 pl-3 pr-[20%] z-10 h-2/3 group hover:bg-transparent outline-none ring-none cursor-default pointer-events-none"><span class="bg-brand rounded-full p-2 inline-flex items-center justify-center text-brand-grey opacity-50"><span class="sr-only">previous slide / item</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true" class="h-6 w-6"><path stroke-linecap="round" stroke-linejoin="round" d="M10 19l-7-7m0 0l7-7m-7 7h18"></path></svg></span></button><div class="slider-wrapper axis-horizontal" style="height:auto"><ul class="slider animated"><li class="slide selected previous" style="position:relative;display:block;z-index:-2;min-height:100%;opacity:1;top:0;right:0;left:0;bottom:0;transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-webkit-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-webkit-transition-duration:350ms;-moz-transition-duration:350ms;-o-transition-duration:350ms;transition-duration:350ms;-ms-transition-duration:350ms"></li><li class="slide" style="position:absolute;display:block;z-index:-2;min-height:100%;opacity:0;top:0;right:0;left:0;bottom:0;transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-webkit-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-webkit-transition-duration:350ms;-moz-transition-duration:350ms;-o-transition-duration:350ms;transition-duration:350ms;-ms-transition-duration:350ms"></li><li class="slide" style="position:absolute;display:block;z-index:-2;min-height:100%;opacity:0;top:0;right:0;left:0;bottom:0;transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-webkit-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-webkit-transition-duration:350ms;-moz-transition-duration:350ms;-o-transition-duration:350ms;transition-duration:350ms;-ms-transition-duration:350ms"></li><li class="slide" style="position:absolute;display:block;z-index:-2;min-height:100%;opacity:0;top:0;right:0;left:0;bottom:0;transition-timing-function:ease-in-out;-ms-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;-webkit-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;-webkit-transition-duration:350ms;-moz-transition-duration:350ms;-o-transition-duration:350ms;transition-duration:350ms;-ms-transition-duration:350ms"></li></ul></div><button class="absolute top-1/2 -translate-y-1/2 right-0 pr-3 pl-[20%] z-10 h-2/3 group hover:bg-transparent outline-none ring-none "><span class="bg-brand rounded-full p-2 inline-flex items-center justify-center text-brand-grey group-hover:text-white group-hover:bg-brand-dark group-focus:outline-none group-focus:ring-2 group-focus:ring-inset group-focus:ring-brand"><span class="sr-only">next slide / item</span><svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" aria-hidden="true" class="h-6 w-6"><path stroke-linecap="round" stroke-linejoin="round" d="M14 5l7 7m0 0l-7 7m7-7H3"></path></svg></span></button></div><div class="carousel"><div class="thumbs-wrapper axis-vertical"><button type="button" class="control-arrow control-prev control-disabled" aria-label="previous slide / item"></button><ul class="thumbs animated" style="-webkit-transform:translate3d(0,
10,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-webkit-transition-duration:350ms;-moz-transition-duration:350ms;-ms-transition-duration:350ms;-o-transition-duration:350ms;transition-duration:350ms;-ms-transition-duration:350ms"><li class="thumb selected" aria-label="slide item 1" style="width:80px" role="button" tabindex="0"><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img alt="Gallery thumbnail 0" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain"/><noscript><img alt="Gallery thumbnail 0" sizes="100vw" srcSet="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_64_75.png 64w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_128_75.png 128w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_320_75.png 320w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_640_75.png 640w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_960_75.png 960w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_1280_75.png 1280w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_1600_75.png 1600w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_1920_75.png 1920w" src="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115123_1920_75.png" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain" loading="lazy"/></noscript></span></li><li class="thumb" aria-label="slide item 2" style="width:80px" role="button" tabindex="0"><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img alt="Gallery thumbnail 1" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain"/><noscript><img alt="Gallery thumbnail 1" sizes="100vw" srcSet="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_64_75.png 64w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_128_75.png 128w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_320_75.png 320w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_640_75.png 640w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_960_75.png 960w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_1280_75.png 1280w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_1600_75.png 1600w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_1920_75.png 1920w" src="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115221_1920_75.png" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain" loading="lazy"/></noscript></span></li><li class="thumb" aria-label="slide item 3" style="width:80px" role="button" tabindex="0"><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img alt="Gallery thumbnail 2" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain"/><noscript><img alt="Gallery thumbnail 2" sizes="100vw" srcSet="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_64_75.png 64w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_128_75.png 128w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_320_75.png 320w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_640_75.png 640w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_960_75.png 960w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_1280_75.png 1280w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_1600_75.png 1600w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_1920_75.png 1920w" src="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115959_1920_75.png" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain" loading="lazy"/></noscript></span></li><li class="thumb" aria-label="slide item 4" style="width:80px" role="button" tabindex="0"><span style="box-sizing:border-box;display:block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:absolute;top:0;left:0;bottom:0;right:0"><img alt="Gallery thumbnail 3" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain"/><noscript><img alt="Gallery thumbnail 3" sizes="100vw" srcSet="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_64_75.png 64w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_128_75.png 128w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_320_75.png 320w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_640_75.png 640w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_960_75.png 960w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_1280_75.png 1280w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_1600_75.png 1600w, /_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_1920_75.png 1920w" src="/_next/static/chunks/images/uploads/screenshot-2025-04-27-115555_1920_75.png" decoding="async" data-nimg="fill" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%;object-fit:contain" loading="lazy"/></noscript></span></li></ul><button type="button" class="control-arrow control-next control-disabled" aria-label="next slide / item"></button></div></div></div><div><p>We developed a mobile AR app capable of detecting and tracking a tennis court, and visualizing ball trajectories. It displays shot details such as speed, height, and spin, along with match data, and includes a replay mode. Users can view a reply from their seat using an AR overlay on their camera feed, or "detach" their perspective to watch replays from any point of view.<br>
2<br>
3A custom AR engine was built from the ground up specifically for this project, combining machine learning and computer vision to detect and track tennis court corners from any angle and accurately overlay digital information - all running on a mobile device.</p>
4</div><button class="mt-6 inline-block py-2 px-8 border border-transparent roun
4ded-full text-base font-bold uppercase bg-brand-grey-light text-white hover:bg-brand-grey no-underline">Back to projects</button></div></div></div></main><footer class="bg-brand-grey" aria-labelledby="footer-heading"><h2 id="footer-heading" class="sr-only">Footer</h2><div class="max-w-7xl mx-auto pt-12 pb-8 px-4 sm:px-6 lg:pt-16 lg:px-8"><div><h3 class="text-brand-lightest tracking-wider uppercase">About Packet39</h3><div class="mt-4 text-base text-brand-grey-light">Just your friendly XR creative studio. We specializes in virtual and augmented reality applications, interactive projection systems, informational kiosks, games and apps for public spaces (museums, libraries, tradeshows, malls, etc.). We&#x27;re based in Canada (Waterloo, Ontario) and work with clients all over the world.</div><p class="mt-6 text-base"><a href="/" class="py-2 mr-8 text-base text-brand hover:text-brand-dark font-bold uppercase whitespace-nowrap inline-block">Home</a><a href="/#about" class="py-2 mr-8 text-base text-brand hover:text-brand-dark font-bold uppercase whitespace-nowrap inline-block">About Us</a><a href="/#projects" class="py-2 mr-8 text-base text-brand hover:text-brand-dark font-bold uppercase whitespace-nowrap inline-block">Projects</a><a href="/blog/" class="py-2 mr-8 text-base text-brand hover:text-brand-dark font-bold uppercase whitespace-nowrap inline-block">Blog</a><a href="/#contact" class="py-2 text-base text-brand hover:text-brand-dark font-bold uppercase whitespace-nowrap inline-block">Contact Us</a></p></div><div class="mt-8 border-t border-brand-grey-light pt-10 md:flex md:items-center md:justify-between"><div class="flex space-x-6 md:order-2"><a href="https://www.facebook.com/Packet39" target="_blank" rel="noreferrer" class="text-brand hover:text-brand-dark"><span class="sr-only">Facebook</span><svg fill="currentColor" viewBox="0 0 24 24" class="h-6 w-6" aria-hidden="true"><path fill-rule="evenodd" d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987
4h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z" clip-rule="evenodd"></path></svg></a><a href="https://www.instagram.com/ShacharWeis" target="_blank" rel="noreferrer" class="text-brand hover:text-brand-dark"><span class="sr-only">Instagram</span><svg fill="currentColor" viewBox="0 0 24 24" class="h-6 w-6" aria-hidden="true"><path fill-rule="evenodd" d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z" clip-rule="evenodd"></path></svg></a><a href="https://twitter.com/vice_packet39" target="_blank" rel="noreferrer" class="text-brand hover:text-brand-dark"><span class="sr-only">Twitter</span><svg fill="currentColor" viewBox="0 0 24 24" class="h-6 w-6" aria-hidden="true"><path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84"></path></svg></a></div><p class="mt-4 text-base text-neutral-400 md:mt-0 md:order-1">© 2026 Packet39 INC. All rights reserved. No hamsters were harmed during the making of this website. </p></div></div></footer></div></div>
4<script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"project":{"attributes":{"title":"Augmented Reality Tennis","date":"2025-05-01T14:57:09.553Z","thumbnail":"/uploads/screenshot-2025-04-27-115123.png","technologies":["Unity","AR","OpenCV"],"gallery":[{"image":"/uploads/screenshot-2025-04-27-115123.png"},{"image":"/uploads/screenshot-2025-04-27-115221.png"},{"image":"/uploads/screenshot-2025-04-27-115959.png"},{"image":"/uploads/screenshot-2025-04-27-115555.png"}],"seo":{"title":"Augmented Reality tennis app"}},"body":"\u003cp\u003eWe developed a mobile AR app capable of detecting and tracking a tennis court, and visualizing ball trajectories. It displays shot details such as speed, height, and spin, along with match data, and includes a replay mode. Users can view a reply from their seat using an AR overlay on their camera feed, or \"detach\" their perspective to watch replays from any point of view.\u003cbr\u003e\n\u003cbr\u003e\nA custom AR engine was built from the ground up specifically for this project, combining machine learning and computer vision to detect and track tennis court corners from any angle and accurately overlay digital information - all running on a mobile device.\u003c/p\u003e\n"},"settingsContent":{"public_url":"https://packet39.com","company_name":"Packet39","logo":"/uploads/packet39-logo-horiz-golds.png","facebook":"Packet39","instagram":"ShacharWeis","twitter":"vice_packet39","commentbox":"5749164210126848-proj","footer":{"about_title":"About Packet39","about_body":"Just your friendly XR creative studio. We specializes in virtual and augmented reality applications, interactive projection systems, informational kiosks, games and apps for public spaces (museums, libraries, tradeshows, malls, etc.). We're based in Canada (Waterloo, Ontario) and work with clients all over the world.","newsletter_title":"Subscribe to our newsletter","newsletter_body":"The latest news, articles, and resources, sent straight to your inbox.","copyright":"© 2026 Packet39 INC. All rights reserved. No hamsters were harmed during the making of this website. "}}},"__N_SSG":true},"page":"/projects/[slug]","query":{"slug":"augmented-reality-tennis"},"buildId":"oTISGQL3YQAPk1kRT3Yk6","isFallback":false,"gsp":true,"scriptLoader":[]}</script>
4</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.