🎨 РаспознаваниС Ρ†Π²Π΅Ρ‚ΠΎΠ² Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ с tracking.js Π·Π° 5 шагов

ИспользованиС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ зрСния для распознавания Ρ†Π²Π΅Ρ‚ΠΎΠ² Π½Π° изобраТСниях ΠΈ Π² Π²ΠΈΠ΄Π΅ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ tracking.js

РСшСниС мноТСства Π·Π°Π΄Π°Ρ‡ машинного зрСния (сСгмСнтация ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Π»ΠΈΡ†) основано Π½Π° распознавании Ρ†Π²Π΅Ρ‚Π°. Благодаря JavaScript-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Tracking.js это ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ прямо Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅!

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ этот ΠΏΠ»Π°Π³ΠΈΠ½, ΠΌΡ‹ создадим Π΄Π΅ΠΌΠΎ-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ для распознавания.

Π’ Π½Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΡ€Π΅Π²ΡŒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΈ ΠΊΠΎΠ»ΠΎΡ€ΠΏΠΈΠΊΠ΅Ρ€ для указания искомого Ρ†Π²Π΅Ρ‚Π°. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ настройку допустимого отклонСния (tolerance) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ слайдСра – эта опция нСпосрСдствСнно Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π΅Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Для максимального удобства Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΈΠΏΠ΅Ρ‚ΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ€Π°Ρ‚ΡŒ Ρ†Π²Π΅Ρ‚ прямо с ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ.

НаТатиС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Track color запускаСт Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ распознавания. НайдСнныС области обводятся Ρ†Π²Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π°ΠΌΠΊΠΎΠΉ.

ΠŸΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎ ссылкС.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ со всСми рСсурсами доступСн Π½Π° GitHub.

РСализация

Tracking.js – ΠΎΠ΄Π½Π° ΠΈΠ· самых простых Π² использовании Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠ³ΠΎ зрСния с Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΠΎΡ€ΠΎΠ³ΠΎΠΌ вхоТдСния. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π±Ρ€Π°Ρ‚ΡŒ Π΅Π΅ ΠΈ сразу ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ.

Π¨Π°Π³ #1. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ рСсурсов

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ tracking.js ΠΈΠ· github-рСпозитория:

git clone https://github.com/eduardolundgren/tracking.js.git

ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ npm-ΠΏΠ°ΠΊΠ΅Ρ‚:

npm install tracking

Для оформлСния интСрфСйса Π½Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ понадобятся:

  • jquery – популярная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для манипуляции DOM-элСмСнтами;
  • color-picker – для создания ΠΊΠΎΠ»ΠΎΡ€ΠΏΠΈΠΊΠ΅Ρ€Π°;
  • rangeslider.js – ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π» для элСмСнта input type="range";
  • broiler.js – для создания ΠΏΠΈΠΏΠ΅Ρ‚ΠΊΠΈ.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ стилСй ΠΈ скриптов всСх ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π»ΡŽΠ±Ρ‹ΠΌ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для вас способом, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² сСкции head Π² html-Ρ„Π°ΠΉΠ»Π΅:

index.html
<html>
  <head>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
    <link rel="stylesheet" href="style/color-tracking.css">
    <link rel="stylesheet" href="style/color-picker.min.css">
    <link rel="stylesheet" href="style/range-slider.css">

    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <script src='js/tracking-min.js'></script>
    <script src='js/color-picker.min.js'></script>
    <script src='js/rangeslider.min.js'></script>
    <script src='js/broiler.js'></script>
  </head>

Π¨Π°Π³ #2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ интСрфСйса

Код HTML Π΄Π΅ΠΌΠΎ-прилоТСния:

index.html
<main>
    <div class="container mt-2">
        <div class="row">
            <div class="col-12 col-lg-4 col-md-6">
                <div class="row col-12 d-block p-0 m-0">
                        <strong class="d-block">Tracking colors</strong>
                        <div id="color-list" class="row color-list m-0"></div>
                        <hr class="d-block m-3">
                </div>

                <div class="row">
                    <div class="col-8">
                        <section id="color-picker"></section>
                        <div class="p-2">
                            <label for="tolerance" class="font-weight-bold">Tolerance:</label>
                            <input type="range" id="tolerance" name="tolerance" min="0" max="100" value="30" step="1">
                            <span class="rangeslider__tooltip" id ="range-tooltip"></span>
                        </div>
                    </div>
                    <div class="col-4">
                        <div id="color-picker-selected"></div>
                        <button id="add-color-button" class="btn btn-primary">Add color</button>
                    </div>
                </div>
            </div>
            <div class="col-12 offset-lg-1 col-lg-7 col-md-6">
                <div class="row">
                        <div class="col-7">
                            <input id="image-selector"  type="file">
                        </div>
                        <div class="col-5">
                            <button id="track-button" class="btn btn-dark float-right">Track color</button>
                        </div>
                </div>
                <hr class="m-3">
                <div class="row">
                    <div class="col-12">
                        <div class="row">
                                <div class="col-7">
                                    <strong class="ml-3">Image</strong>
                                </div>
                                <div class="col-5">
                                    <button id="clear-button" class="btn btn-dark float-right">Clear</button>
                                </div>
                        </div>
                        
                        <div class="col-12 p-0 tooltip" id="image-container">
                            <img id="selected-image" class="p-0 col-12" src="images/CMYK.jpg" />
                            <span class="tooltiptext">Click to pick color from image</span>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</main>
<script src='js/range-slider.js'></script>
<script src="js/color-tracking.js"></script>

Π—Π΄Π΅ΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ скрипты: range-slider.js ΠΈ Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» color-tracking.js.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ инициализация слайдСра ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° tolerance – Ρ„Π°ΠΉΠ» range-slider.js:

js/range-slider.js
const $element = $('input[type="range"]');
let $handle;

$element
  .rangeslider({
    polyfill: false,
    onInit: function() {
      $handle = $('.rangeslider__handle', this.$range);
      updateHandle($handle[0], this.value);
    }
  })
  .on('input', function() {
    updateHandle($handle[0], this.value);
  });

// ОбновлСниС значСния Π² ΠΏΠΎΠ»Π·ΡƒΠ½ΠΊΠ΅ слайдСра
function updateHandle(el, val) {
  el.textContent = val;
}

Π¨Π°Π³ #3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π°

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ tracking.js, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ Ρ†Π²Π΅Ρ‚Π° для распознавания. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ прСдлагаСтся Π½Π°Π±ΠΎΡ€ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ†Π²Π΅Ρ‚ΠΎΠ²: ΠΏΡƒΡ€ΠΏΡƒΡ€Π½Ρ‹ΠΉ (magenta), Π±ΠΈΡ€ΡŽΠ·ΠΎΠ²Ρ‹ΠΉ (cyan) ΠΈ ΠΆΠ΅Π»Ρ‚Ρ‹ΠΉ (yellow).

js/color-tracking.js
let regColors = ['magenta', 'cyan', 'yellow'];
let tracker = new tracking.ColorTracker(regColors);

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π°. Для этого ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ API tracking.ColorTracker.registerColor:

color-tracking.js
$("#add-color-button").click(async function () {
    let color = $('#color-picker-selected').css( "background-color" );
    regColors.push(color);
    let t = slider.value;
    tracking.ColorTracker.registerColor(color, function(r, g, b) {
        return getColorDistance(getRGB(color), {r: r, g: g, b: b}) < t
    });
    displayColorList(regColors, 'color-list');
});

function getColorDistance(target, actual) {
    return Math.sqrt(
      (target.r - actual.r) * (target.r - actual.r) +
      (target.g - actual.g) * (target.g - actual.g) +
      (target.b - actual.b) * (target.b - actual.b)
    );
}

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ отслСТиваСт Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Β» (Add color) ΠΈ рСгистрируСт Π² Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π΅ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ Π² ΠΊΠΎΠ»ΠΎΡ€ΠΏΠΈΠΊΠ΅Ρ€Π΅ Ρ†Π²Π΅Ρ‚. ΠœΠ΅Ρ‚ΠΎΠ΄ registerColor ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: собствСнно Ρ†Π²Π΅Ρ‚ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сравнСния, которая Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Ρ†Π²Π΅Ρ‚Π°. Π’ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ "Ρ€Π°Π·Π½ΠΈΡ†Ρƒ" ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π΅ с установлСнным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° tolerance.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρ‡Π΅ΠΌ большС tolerance, Ρ‚Π΅ΠΌ большС Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Ρ†Π²Π΅Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ подходящими ΠΈ ΠΏΠΎΠΏΠ°Π΄ΡƒΡ‚ Π² Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅.

ΠœΠ΅Ρ‚ΠΎΠ΄ displayColorList Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ всС Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π°. Π•Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π¨Π°Π³ #4. Бобытия Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π°

Когда Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ искомыС Ρ†Π²Π΅Ρ‚Π° Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ, ΠΎΠ½ выбросит событиС track, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ.

color-tracking.js
tracker.on('track', function(event) {
    event.data.forEach(function(rect) {
        drawRect(rect.x, rect.y, rect.width, rect.height, rect.color);
    });
});


function drawRect(x, y, w, h, color){
    let rect = $('<div></div>');
    rect.addClass('rect');
    rect.css({
        border : '2px solid ' + color,
        width : w + 'px',
        height : h + 'px',
        left : (img.offsetLeft + x) + 'px',
        top : (img.offsetTop + y) + 'px'
    });
    $('#image-container').append(rect);
}

Π’ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ события хранятся ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ всСх Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… областСй. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ области Ρ‚Π°ΠΊΠΆΠ΅ доступСн Ρ†Π²Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½Π° соотвСтствуСт.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² эти Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΡ‹ создаСм ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΈΡ… Π½Π° ΠΏΡ€Π΅Π²ΡŒΡŽ (ΠΌΠ΅Ρ‚ΠΎΠ΄ drawRect).

Π¨Π°Π³ #5. Установка изобраТСния

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Ρƒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π°. Для этого ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ статичСский ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ track:

color-tracking.js
tracking.track('#selected-image', tracker);

Π’ Π½Π΅Π³ΠΎ слСдуСт ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ сСлСктор Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ элСмСнта img (Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ video ΠΈ canvas) ΠΈ экзСмпляр Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π°.

ОбъСдиним вСсь ΠΊΠΎΠ΄ создания ΠΈ запуска Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π° ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Track color:

$("#track-button").click(async function () {
    if($( ".rect" ).length){
        $( ".rect" ).remove();
    }
    let tracker = new tracking.ColorTracker(regColors);
    tracker.on('track', function(event) {
        event.data.forEach(function(rect) {
            drawRect(rect.x, rect.y, rect.width, rect.height, rect.color);
        });
    });
    tracking.track('#selected-image', tracker);
});

Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС области, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ поиска. Π—Π°Ρ‚Π΅ΠΌ придСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π° с Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌΠΈ Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события track ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

Π’ΡΡŽ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ (Π²Ρ‹Π±ΠΎΡ€ Ρ†Π²Π΅Ρ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΈΠΏΠ΅Ρ‚ΠΊΠΈ, смСна ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, сброс Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² поиска) Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ прилоТСния.

***

ΠšΡ€ΠΎΠΌΠ΅ обнаруТСния Ρ†Π²Π΅Ρ‚Π° прямо Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ (Π½Π° изобраТСниях ΠΈ Π΄Π°ΠΆΠ΅ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ), Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° tracking.js ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Π»ΠΈΡ†Π° людСй, Π½ΠΎ Π½Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ ΠΈΡ…. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

matyushkin
07 апрСля 2020

ВОП-15 ΠΊΠ½ΠΈΠ³ ΠΏΠΎ Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Книги ΠΏΠΎ Python (ΠΈ связанным с Π½ΠΈΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ‚Π΅ΠΌΠ°ΠΌ) Π½Π° русском языкС. Рас...
Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
16 ноября 2019

DeepFake-Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»: создаСм собствСнный Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊ Π² DeepFaceLab

РассказываСм ΠΎ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ DeepFake ΠΈ шаг Π·Π° шагом учимся Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΈΠΏΡ„Π΅ΠΉΠΊΠΈ Π² ...
admin
14 июля 2017

ПишСм свою Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ: пошаговоС руководство

ΠžΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π³Π°ΠΉΠ΄ ΠΏΡ€ΠΎ Π½Π΅ΠΉΡ€ΠΎΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… элСмС...