2015-05-08 3 views
0

Я пытаюсь получить пример JSFiddle http://trackingjs.com/examples/face_tag_friends.html, но эффект зависания не работает, как показывает веб-сайт. Вот мой JSFiddle:Почему этот Jsfiddle не работает: пример обнаружения tracking.js

https://jsfiddle.net/lolptdr/25yqfyjo/6/

Я должен был использовать прокси на raw.githubusercontent.com и изменил его raw.githack.com для внешних скриптов, упоминаемых в HTML, чтобы обойти MIME тип жалобы. Нет других ошибок консоли, а что еще не так?

Что еще я могу проверить, чтобы получить тот же эффект, что и на веб-сайте trackingjs.com?

window.onload = function() { 
 
    var img = document.getElementById('img'); 
 
    var tracker = new tracking.ObjectTracker('face'); 
 
    tracking.track(img, tracker); 
 
    tracker.on('track', function(event) { 
 
    event.data.forEach(function(rect) { 
 
     plotRectangle(rect.x, rect.y, rect.width, rect.height); 
 
    }); 
 
    }); 
 
    var friends = ['Thomas Middleditch', 'Martin Starr', 'Zach Woods']; 
 
    var plotRectangle = function(x, y, w, h) { 
 
    var rect = document.createElement('div'); 
 
    var arrow = document.createElement('div'); 
 
    var input = document.createElement('input'); 
 
    input.value = friends.pop(); 
 
    rect.onclick = function name() { 
 
     input.select(); 
 
    }; 
 
    arrow.classList.add('arrow'); 
 
    rect.classList.add('rect'); 
 
    rect.appendChild(input); 
 
    rect.appendChild(arrow); 
 
    document.getElementById('photo').appendChild(rect); 
 
    rect.style.width = w + 'px'; 
 
    rect.style.height = h + 'px'; 
 
    rect.style.left = (img.offsetLeft + x) + 'px'; 
 
    rect.style.top = (img.offsetTop + y) + 'px'; 
 
    }; 
 
};
* { 
 
    margin: 0; 
 
    padding: 0; 
 
    font-family: Helvetica, Arial, sans-serif; 
 
} 
 
.demo-title { 
 
    position: absolute; 
 
    width: 100%; 
 
    background: #2e2f33; 
 
    z-index: 2; 
 
    padding: .7em 0; 
 
} 
 
.demo-title a { 
 
    color: #fff; 
 
    border-bottom: 1px dotted #a64ceb; 
 
    text-decoration: none; 
 
} 
 
.demo-title p { 
 
    color: #fff; 
 
    text-align: center; 
 
    text-transform: lowercase; 
 
    font-size: 15px; 
 
} 
 
.demo-frame { 
 
    background: url(frame.png) no-repeat; 
 
    width: 854px; 
 
    height: 658px; 
 
    position: fixed; 
 
    top: 50%; 
 
    left: 50%; 
 
    margin: -329px 0 0 -429px; 
 
    padding: 95px 20px 45px 34px; 
 
    overflow: hidden; 
 
    -webkit-box-sizing: border-box; 
 
    -moz-box-sizing: border-box; 
 
    -ms-box-sizing: border-box; 
 
    box-sizing: border-box; 
 
} 
 
.demo-container { 
 
    width: 100%; 
 
    height: 530px; 
 
    position: relative; 
 
    background: #eee; 
 
    overflow: hidden; 
 
    border-bottom-right-radius: 10px; 
 
    border-bottom-left-radius: 10px; 
 
} 
 
.dg.ac { 
 
    z-index: 100 !important; 
 
    top: 50px !important; 
 
} 
 
/* example's CSS */ 
 

 
#photo:hover .rect { 
 
    opacity: .75; 
 
    transition: opacity .75s ease-out; 
 
} 
 
.rect:hover * { 
 
    opacity: 1; 
 
} 
 
.rect { 
 
    border-radius: 2px; 
 
    border: 3px solid white; 
 
    box-shadow: 0 16px 28px 0 rgba(0, 0, 0, 0.3); 
 
    cursor: pointer; 
 
    left: -1000px; 
 
    opacity: 0; 
 
    position: absolute; 
 
    top: -1000px; 
 
} 
 
.arrow { 
 
    border-bottom: 10px solid white; 
 
    border-left: 10px solid transparent; 
 
    border-right: 10px solid transparent; 
 
    height: 0; 
 
    width: 0; 
 
    position: absolute; 
 
    left: 50%; 
 
    margin-left: -5px; 
 
    bottom: -12px; 
 
    opacity: 0; 
 
} 
 
input { 
 
    border: 0px; 
 
    bottom: -42px; 
 
    color: #a64ceb; 
 
    font-size: 15px; 
 
    height: 30px; 
 
    left: 50%; 
 
    margin-left: -90px; 
 
    opacity: 0; 
 
    outline: none; 
 
    position: absolute; 
 
    text-align: center; 
 
    width: 180px; 
 
    transition: opacity .35s ease-out; 
 
} 
 
#img { 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
    margin: -173px 0 0 -300px; 
 
}
<script src="https://raw.githack.com/eduardolundgren/tracking.js/master/build/tracking.js"></script> 
 
<script src="https://raw.githack.com/eduardolundgren/tracking.js/master/build/data/face.js"></script> 
 
<div class="demo-title"> 
 
    <p><a href="http://trackingjs.com" target="_parent">tracking.js</a> - hover image to see all faces detected</p> 
 
</div> 
 
<div class="demo-frame"> 
 
    <div class="demo-container"> <span id="photo"><img id="img" src="https://raw.githubusercontent.com/eduardolundgren/tracking.js/master/examples/assets/faces.jpg" /></span> 
 

 
    </div> 
 
</div>

ответ

1

Все вышеперечисленные ответы решить, почему это не удается очень хорошо, но вот рабочий пример tracker.js в jsfiddle используя FLICKR изображение: http://jsfiddle.net/rambutan2000/v5v49bax/

Flickr, кажется, Access-Control-Allow-Origin набор правильно в заголовке. У меня был ограниченный успех, используя прокси (crossorigin.me).

Thi представляет собой упрощенную версию этого примера: https://trackingjs.com/examples/face_hello_world.html

Сначала я должен был получить действительные адреса в Tracker включает, я использовал эту услугу: http://rawgit.com. Посмотрите в «Внешние ресурсы» в jsfiddle.

Я основывал это на примере, который использует XMLHttpRequest для извлечения данных изображения в качестве буфера, а затем загружает его в элемент img. Это отрицает некоторые проблемы CORS на элементе img, поскольку он был получен из кода, а не URL-адреса. Остальное разорвано прямо из примера Tracker, упомянутого выше.

JS:

// use http://rawgit.com/ to get js urls from github 
// use https://crossorigin.me/ to get around CORS for image reference 
function _arrayBufferToBase64(buffer) { 
    var binary = '' 
    var bytes = new Uint8Array(buffer) 
    var len = bytes.byteLength; 
    for (var i = 0; i < len; i++) { 
     binary += String.fromCharCode(bytes[i]) 
    } 
    return window.btoa(binary); 
} 

window.plot = function(x, y, w, h) { 
    var $rect = $("<div></div>"); 
    $rect.addClass("rect"); 
    $rect.offset({ top: y, left: x }); 
    $rect.width(w).height(h);  
    $("#demo-container").append($rect);  
}; 

var imgURL = 'https://c1.staticflickr.com/4/3943/15715482121_d7120a6e0b_z.jpg'; // Works! 
//var imgURL = 'https://placeimg.com/640/480/people'; // Does not work 
//var imgURL = 'https://crossorigin.me/https://placeimg.com/640/480/people'; // Works! 


var oReq = new XMLHttpRequest(); 
oReq.open("GET", imgURL, true); 
oReq.responseType = "arraybuffer"; 

oReq.onload = function (oEvent) { 
    var arrayBuffer = oReq.response; // Note: not oReq.responseText 
    if (arrayBuffer) { 
     var x = imgURL.split('.'); 
     var ext = x[x.length - 1]; 
     var b64img = _arrayBufferToBase64(arrayBuffer); 
     $("#img").attr('src', 'data:image/' + ext + ';base64,' + b64img).appendTo($('body'));   

     var img = document.getElementById('img'); 
     var tracker = new tracking.ObjectTracker(['face']); 

     tracker.setStepSize(1.7); 
       tracking.track('#img', tracker); 

     tracker.on('track', function(event) {   
      event.data.forEach(function(rect) { 
       console.log(rect); 
       window.plot(rect.x, rect.y, rect.width, rect.height); 
      }); 
     }); 
    } 
}; 

oReq.send(null); 

HTML:

<div id="demo-container"> 
    <img id="img" src="" /> 
</div> 

CSS:

.rect { 
    position:absolute; 
    border-style: solid; 
    border-width: 2px; 
    border-color: blue; 
} 

#demo-container { 
    position:absolute; 
} 
1

Это быстрый ответ, но, надеюсь, это поможет вам понять, что происходит. Это провал, потому что код пытается загрузить этот ресурс: http://trackingjs.com/bower/tracking.js/examples/assets/frame.png

Вы можете видеть, что он загружен на исходной странице: http://trackingjs.com/examples/face_tag_friends.html и вы можете увидеть, что ваш JSFiddle пытается загрузить его, а также (хотя и с другой хозяина, такой же относительный путь). Когда браузер пытается GET https://fiddle.jshell.net/25yqfyjo/7/show/frame.png, 404 происходит, потому что файл не существует, и это останавливает выполнение.

Посмотрите на свои инструменты разработчика во время работы JSFiddle. Я предполагаю, что этот другой скрипт, который вы загружаете (https://raw.githack.com/eduardolundgren/tracking.js/master/build/data/face.js), который представляется двоичными данными (рендеринг изображения), не должен быть включен. Вместо этого пройдите базовую документацию для http://trackingjs.com/ и поймите, как использовать распознавание лиц на вашей собственной фотографии. Предположительно, будет легче и работать.

1

Cross Origin: я обновил свой код, чтобы использовать DOMContentLoaded и вручную запуская событие, так что вы можете увидеть проблему: https://jsfiddle.net/25yqfyjo/11/

Так что я принуждая событие с

// Create the event 
var event = new CustomEvent("DOMContentLoaded", { "detail": "Content Loaded trigger" }); 

// Dispatch/Trigger/Fire the event 
document.dispatchEvent(event); 

И ты можно увидеть в консоли ошибку:

Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin

data.tracking.trackCanvasInternal_ @

tracking.js:196(anonymous function) @

tracking.js:221img.onload @

tracking.js:472

Это связано с тем, что вы загружаете изображение из другого URL-адреса int o холст, который используется вашим кодом (хотя вы не можете видеть его, var tracker = new tracking.ObjectTracker('face'); будет использовать холст), я думаю, что для целей JS Fiddle вы можете изменить кодировку Image to Base64 и это исправит проблему.

1

Вам нужно будет более действия:

Первый открытый F12 инструмент разработчика (хром) Вкладка Гото консольный переключатель кадра в:

enter image description here

Теперь вы можете отслеживать ваш код. Я обнаружил, что ваш код js выглядит так, как будто вы используете . Window.onload не имеет особого значения (разрывы тегов). У вас больше времени при загрузке кода. Каждый раз, когда вы вызываете window.onload = SOMETHING, вы переопределяете эту функцию. window.onload - это функция с однократным выполнением. Просто загрузите документ. Это не JQ.

Также у вас есть:

GET https://fiddle.jshell.net/lolptdr/25yqfyjo/6/show/frame.png 404 (Not Found) 

Это пространство имен {} для JS, если у вас есть ошибка, как это.

{ 
exeOK() 
IamError() ; BREAKS HERE 
IneverLoaded() 
} 

Это может быть также ваше решение: Проверка отладчика вы нагрузить JS код до конца.

 Смежные вопросы

  • Нет связанных вопросов^_^