2012-04-18 9 views
6

Ho bisogno di scrivere un progetto semplice e sto usando opencv, ruby ​​e mac. Ho installato opencv tramite brew e rb_webcam tramite gem install.Highgui and ruby ​​

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

require "opencv" 
require "rb_webcam" 

capture = Webcam.new 

Questo codice genera

$ 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>' 

Non riesco a come posso punto in cui è highgui.

UPD: Risolto il problema scaricando la gemma da qui https://github.com/TyounanMOTI/rb_webcam e costruendola e installandola manualmente.

+1

Edificio da fonte ha funzionato per me. –

risposta

4

Non sai quale wrapper stai usando, ma dovresti dare un'occhiata a questo: Ruby/OpenCV - An OpenCV Ruby wrapper.

volto del campione di rilevazione:

#!/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 

Il classificatore può essere scaricato here.

EDIT:

The following code utilizza OpenCV, la gemma rb_webcam, e RMagick per catturare un'immagine da una webcam e salvarlo come file 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

Grazie, Karl. Sto usando questo wrapper: https://github.com/ser1zw/ruby-opencv. Funziona bene con il rilevamento del volto. Ma ho anche bisogno di far funzionare highgui per far funzionare la mia webcam. Questo è il problema. – evilgeniuz

+0

Hai provato ad aggiungere 'include OpenCV' al tuo codice? – karlphillip

+0

Risposta aggiornata. Anche [test_cvcapture.rb] (https://github.com/ser1zw/ruby-opencv/blob/master/test/test_cvcapture.rb) presenta un bell'esempio di come acquisire dal file. – karlphillip

2

Forse è troppo tardi, ma stavo anche faticando, portando la mia webcam al lavoro finché nella rabbia senza speranza ho provato 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 

Spero che questo aiuti, perché ho rinunciato a rb_webcam dopo un problema highgui oltre una settimana.

+0

Un profondo ringraziamento, andare con OpenCV è stato molto più semplice dell'uso di 'rb_webcam' – Dorian

1

Con il ruby-opencv gemma:

require "opencv" 

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

(Installazione OpenCV su MacOS: brew install homebrew/science/opencv --HEAD)

0

migliore piattaforma trasversale, fuori dalla scatola

<!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 - :-) forgott sua pw

0

Almeno su Windows, potremmo specificare v numero di ersione a load_library come seguendo a rb_webcam.rb linea 7:

load_library("opencv_highgui2413")