2012-04-18 143 views
6

我需要寫一個簡單的項目,我使用opencv,ruby和mac。 我已經通過brew安裝了opencv,並通過gem install安裝了rb_webcam。Highgui和紅寶石

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

require "opencv" 
require "rb_webcam" 

capture = Webcam.new 

此代碼拋出

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

我不能讓我怎麼能指出其中highgui是。

UPD: 通過從這裏下載gem https://github.com/TyounanMOTI/rb_webcam並通過手動構建和安裝來解決此問題。

+1

從源代碼構建工作對我而言。 – 2015-10-26 19:01:06

回答

4

不確定你正在使用哪個包裝,但你應該看看這個:Ruby/OpenCV - An OpenCV Ruby wrapper

人臉檢測樣品:

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

該分類器可以被下載here

編輯

The following code使用了OpenCV的rb_webcam寶石,並RMagick從網絡攝像頭捕捉的圖像,並將其保存爲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

謝謝,卡爾。我正在使用這個包裝:https://github.com/ser1zw/ruby-opencv。它可以很好地處理人臉檢測。但是我也需要讓highgui爲我的攝像頭工作。那就是問題所在。 – evilgeniuz 2012-04-18 18:58:41

+0

您是否嘗試在代碼中添加「包含OpenCV」? – karlphillip 2012-04-18 19:04:10

+0

已更新的答案。另外[test_cvcapture.rb](https://github.com/ser1zw/ruby-opencv/blob/master/test/test_cvcapture.rb)提供了一個很好的如何從文件中捕獲的例子。 – karlphillip 2012-04-18 19:06:06

2

也許是太晚了,但我也在掙扎,讓我的攝像頭工作 ,直到我意外地嘗試了無望的憤怒:

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

希望這個幫忙,因爲我在一個多星期後高舉了一個問題就放棄了rb_webcam

+0

非常感謝你,使用OpenCV比使用'rb_webcam'更簡單 – Dorian 2016-10-08 22:40:43

1

隨着ruby-opencv寶石:

require "opencv" 

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

(在MacOS上安裝OpenCV的:brew install homebrew/science/opencv --HEAD

0

最好的跨平臺的開箱

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

0

至少在Windows上,我們可能應該指定v load_library上的ersion數字,如下面的rb_webcam.rb第7行:

load_library("opencv_highgui2413")