2012-04-18 5 views
6

Necesito escribir un proyecto simple y estoy usando opencv, ruby ​​y mac. He instalado opencv a través de brew y rb_webcam a través de gem install.Highgui y ruby ​​

# -*- coding: utf-8 -*- 

require "opencv" 
require "rb_webcam" 

capture = Webcam.new 

Este código lanza

$ ruby tracking.rb 
/Users/evilgeniuz/.rvm/gems/ruby-1.9.3-p125/gems/nice-ffi-0.4/lib/nice-ffi/library.rb:98:in `load_library': Could not load highgui. (LoadError) 
    from /Users/evilgeniuz/.rvm/gems/ruby-1.9.3-p125/gems/rb_webcam-0.3.0/lib/rb_webcam.rb:7:in `<module:Highgui>' 
    from /Users/evilgeniuz/.rvm/gems/ruby-1.9.3-p125/gems/rb_webcam-0.3.0/lib/rb_webcam.rb:4:in `<top (required)>' 
    from /Users/evilgeniuz/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/rubygems/custom_require.rb:59:in `require' 
    from /Users/evilgeniuz/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/rubygems/custom_require.rb:59:in `rescue in require' 
    from /Users/evilgeniuz/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/rubygems/custom_require.rb:35:in `require' 
    from tracking.rb:4:in `<main>' 

no puedo conseguir cómo puedo punto en el que es highgui.

UPD: Resuelto descargando gema desde aquí https://github.com/TyounanMOTI/rb_webcam y compilándolo e instalándolo manualmente.

+1

La construcción desde la fuente funcionó para mí. –

Respuesta

4

No estoy seguro de qué envoltorio está utilizando, pero debería echarle un vistazo a esto: Ruby/OpenCV - An OpenCV Ruby wrapper.

Cara de la muestra de detección:

#!/usr/bin/env ruby 

require 'opencv' 

include OpenCV 

# Load an image 
img = IplImage.load('sample.jpg') 

# Load the cascade for detecting faces 
detector = CvHaarClassifierCascade::load('haarcascade_frontalface_alt.xml.gz') 

# Detect faces and draw rectangles around them 
detector.detect_objects(img) do |rect| 
    img.rectangle!(rect.top_left, rect.bottom_right, color: CvColor::Red) 
end 

# Create a window and show the image 
window = GUI::Window.new('Face Detection') 
window.show(img) 
GUI::wait_key 

El clasificador puede ser descargado here.

EDITAR:

The following code utiliza OpenCV, la gema rb_webcam y RMagick para capturar una imagen de una webcam y lo guarda como un archivo JPG:

require 'rb_webcam' 
require 'RMagick' 

capture = Webcam.new 

image = capture.grab 
width = image.size[:width] 
rows = image.data.unpack("C*").each_slice(3).to_a.each_slice(width).to_a 
capture.close 

height = rows.length 
img = Magick::Image.new width, height 

rows.each_with_index do |r, i| 
q = r.map {|b, g, r| Magick::Pixel.new r * 256, g * 256, b * 256, 0} 
img.store_pixels(0, i, width, 1, q) 
end 

img.format = 'jpg' 
img.write 'webcam.jpg' 
+0

Gracias, Karl. Estoy usando este contenedor: https://github.com/ser1zw/ruby-opencv. Funciona bien con la detección de rostros. Pero también necesito que Highgui trabaje para que mi cámara web funcione. Ese es el problema. – evilgeniuz

+0

¿Has intentado agregar 'incluir OpenCV' a tu código? – karlphillip

+0

Respuesta actualizada. También [test_cvcapture.rb] (https://github.com/ser1zw/ruby-opencv/blob/master/test/test_cvcapture.rb) presenta un buen ejemplo de cómo capturar desde un archivo. – karlphillip

2

Tal vez sea demasiado tarde, pero yo también estaba luchando, haciendo que mi webcam funcione hasta que, sin esperanza, intenté accidentalmente:

#!/usr/bin/env ruby 

require "rubygems" 
gem "ruby-opencv" 

require "opencv" 

window = OpenCV::GUI::Window.new("webcam") 
capture = OpenCV::CvCapture.open 

while true 
    key = OpenCV::GUI::wait_key(1) 
    image = capture.query 
    window.show image 

    next unless key 
    case key.chr 
    when "\e" 
    exit 
    end 
end 

Espero que esto ayude, porque me rendí en rb_webcam después de más de una semana de problemas de highgui.

+0

Muchas gracias, ir con OpenCV fue mucho más simple que usar 'rb_webcam' – Dorian

1

Con la ruby-opencv joya:

require "opencv" 

capture = OpenCV::CvCapture.open 
sleep 1 # Warming up the webcam 
capture.query.save("image.jpg") 
capture.close 

(Instalación de OpenCV en MacOS: brew install homebrew/science/opencv --HEAD)

0

mejor plataforma cruzada de la caja

<!doctype html> 
<html lang="de"> 
<head> 
<style type="text/css"> 
     form > input { margin-right: 15px; } 
     #results { float:center; margin:5px; padding:5px; border:1px solid; background:#ccc; } 
    </style> 
</head> 
<table class="reference notranslate"> 
<tr> 
    <th>Webcam</th> 
    <th>Your captured image will appear here..</th> 
</tr> 
</tr> 
    <td> 
<video autoplay id="vid" width="320" height="240" style="border:1px solid #d3d3d3;"></video></br> 
<button onclick="snapshot()">Take Picture</button> 
    </td> 
    <td> 
<div id="results">Your captured image will appear here...< 
<canvas id="canvas" width="320" height="240"></canvas> 
</div> 
<br> 

<button onclick="upload()">upload</button> 
    </td> 
</tr> 
</table> 
<script type="text/javascript"> 

    var video = document.querySelector("#vid"); 
    var canvas = document.querySelector('#canvas'); 
    var ctx = canvas.getContext('2d'); 
    ctx.scale(0.5,0.5); 
    var localMediaStream = null;  



    var onCameraFail = function (e) { 
     console.log('Camera did not work.', e); 
    } 

    function snapshot() { 
     if (localMediaStream) { 
      ctx.drawImage(video, 0, 0); 

    } 
    } 
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; 
    window.URL = window.URL || window.webkitURL; 
    navigator.getUserMedia({video:true}, function (stream) { 
     video.src = window.URL.createObjectURL(stream); 
     localMediaStream = stream; 
    }, onCameraFail); 

redirectTime = "1500"; 

function timedRedirect() { 

    setTimeout("history.back();",redirectTime); 
}; 

function upload() { 
var oCanvas = document.getElementById("canvas"); 
Canvas2Image.saveAsPNG(oCanvas); // will prompt the user to save the image as PNG 
var oImgPNG = Canvas2Image.saveAsPNG(oCanvas, true); 
JavaScript:timedRedirect() 

}; 


</script> 

-cartasu - :-) FORGOT su pw

0

Al menos en Windows, deberíamos especificar v número de ersión en load_library como el siguiente en rb_webcam.rb línea 7:

load_library("opencv_highgui2413")