ruby-opencvメモ

OpenCV::IplImageのメソッド

IPL(Intel Image Processing Library) Image class.
IplImage is subclass of CvMat. IplImage support ROI(region of interest) and COI(color of interest). Most of CvMat method support ROI, and some of CvMat method support COI.
http://www.ruby-doc.org/gems/docs/o/opencv-0.0.6/OpenCV/IplImage.html

グレーアウトしているのはObjectクラスのMethods。

require 'opencv'

pry(main)> OpenCV::IplImage.new(100,100).methods
=> [:!, :!=, :!~, :&, :*, :+, :-, :/, :<=>, :==, :===, :=~, :, :=, :^, 
 :__binding__, :__id__, :__send__, 
 :abs_diff, :adaptive_threshold, :add, :and, :at, :avg, :avg_sdv, 
 :cam_shift, :canny, :channel, :circle, :circle!, :class, :clear, :clear!, :clone, :coi, :coi=, :cols, :columns, :convert_scale, :convert_scale_abs, :copy, :copy_make_border, :corner_eigenvv, :corner_harris, :corner_min_eigen_val, :count_non_zero, :create_mask, :cross_product, 
 :data, :dct, :define_singleton_method, :depth, :det, :determinant, :dft, :diag, :diagonal, :dilate, :dilate!, :dim_size, :dims, :display, :div, :dot_product, :draw_chessboard_corners, :draw_chessboard_corners!, :draw_contours, :draw_contours!, :dup, 
 :each_col, :each_column, :each_row, :eigenvv, :ellipse, :ellipse!, :ellipse_box, :ellipse_box!, :encode, :encode_image, :enum_for, :eq, :eql?, :equal?, :equalize_hist, :erode, :erode!, :extend, :extract_surf, 
 :fill, :fill!, :fill_convex_poly, :fill_convex_poly!, :fill_poly, :fill_poly!, :filter2d, :find_chessboard_corners, :find_contours, :find_contours!, :find_corner_sub_pix, :flip, :flip!, :flood_fill, :flood_fill!, :freeze, :frozen?, 
 :ge, :get_coi, :get_cols, :get_roi, :get_rows, :good_features_to_track, :gt, 
 :hash, :height, :hough_circles, :hough_lines, 
 :identity, :identity!, :in_range, :initialize_clone, :initialize_dup, :inpaint, :inside?, :inspect, :instance_eval, :instance_exec, :instance_of?, :instance_variable_defined?, :instance_variable_get, :instance_variable_set, :instance_variables, :integral, :invert, :is_a?, 
 :kind_of?, 
 :laplace, :le, :line, :line!, :log_polar, :lt, :lut, 
 :mat_mul, :match_descriptors, :match_shapes, :match_template, :mean_shift, :method, :method_missing, :methods, :min_max_loc, :moments, :morphology, :mul, :mul_transposed, 
 :ne, :nil?, :normalize, :not, :not!, 
 :object_id, :optical_flow_bm, :optical_flow_hs, :optical_flow_lk, :or, 
 :perspective_transform, :poly_line, :poly_line!, :pre_corner_detect, :pretty_inspect, :pretty_print, :pretty_print_cycle, :pretty_print_inspect, :pretty_print_instance_variables, :private_methods, :protected_methods, :pry, :public_method, :public_methods, :public_send, :put_text, :put_text!, :pyr_down, :pyr_mean_shift_filtering, :pyr_segmentation, :pyr_up, 
 :quadrangle_sub_pix, 
 :rand_shuffle, :rand_shuffle!, :range, :range!, :rect_sub_pix, :rectangle, :rectangle!, :remap, :repeat, :reset_coi, :reset_roi, :reshape, :resize, :respond_to?, :respond_to_missing?, :roi, :roi=, :rows, 
 :save, :save_image, :sdv, :send, :set, :set!, :set_coi, :set_data, :set_roi, :set_zero, :set_zero!, :singleton_class, :singleton_methods, :size, :smooth, :smoothness, :snake_image, :sobel, :split, :square?, :sub, :sub_rect, :subrect, :sum, :svd, 
 :t, :taint, :tainted?, :tap, :threshold, :to_16s, :to_16u, :to_32f, :to_32s, :to_64f, :to_8s, :to_8u, :to_CvMat, :to_IplConvKernel, :to_enum, :to_s, :trace, :transform, :transpose, :trust, 
 :untaint, :untrust, :untrusted?, 
 :vector?, 
 :warp_affine, :warp_perspective, :watershed, :width, 
 :xor, 
 :zero, :zero!, 
 :|]

OpenCV::IplImageで領域限定(切り抜き代わり)・リセット

画像image.jpgの左上を原点として(x, y)を左上とする幅w, 高さhの長方形を切り抜いてimage_crop.jpgとして保存する

OpenCV::IplImage.load("image.jpg").set_roi(OpenCV::CvRect.new(x, y, w, h)).save_image("image_crop.jpg")

一旦imgへ保存してからimage_crop.jpgに保存

img = OpenCV::IplImage.load("image.jpg")
img.set_roi(OpenCV::CvRect.new(x, y, w, h)).save_image("image_crop.jpg")

set_roiするとimgが(x, y, w, h)の領域に限定されてしまう(例えばコピーや拡大縮小すると限定領域だけで処理を行う)ので、全体を扱うにはroi_resetリセットする

img.reset_roi

なお、roiはRegion of Interestの意味。本来は画像の照合とかをしたときに指定される領域、のはず。CvMatでは扱えないのでIplImageを使う。

OpenCV::IplImageまたはOpenCV::CvMatで拡大縮小

画像image.jpgを幅w, 高さhの長方形に拡大縮小してimage_resize.jpgとして保存する

OpenCV::CvMat.load("image.jpg").resize(OpenCV::CvSize.new(w, h)).save_image("image_resize.jpg")

IplImageも同じ(CvMatのsubclassですから)なので以下ではCvMatのみ記載。

OpenCV::IplImage.load("image.jpg").resize(OpenCV::CvSize.new(w, h)).save_image("image_resize.jpg")

OpenCV::IplImageまたはOpenCV::CvMatでCanny edge検出

画像image.jpgを白黒化してキャニーエッジ検出。下閾値canny_low_threshと上閾値canny_high_threshをパラメータに。aperture_sizeはSobelフィルタのサイズで奇数。大きくするとノイズを拾いやすいみたい。3に固定。

OpenCV::CvMat.load("image.jpg").BGR2GRAY.canny(canny_low_thresh, canny_high_thresh, 3)

二つしきい値(LT, HT)を与えて以下の条件でエッジどうか判定
1. HTより大きいエッジ強度の画素はエッジ
2. LHより小さいエッジ強度の画素は非エッジ
3. LH以上HT以下のエッジ強度の画素のうちエッジに結合してる画素はエッジ
しぼりたてブログ Canny Edge Detection -アルゴリズム-

Canny recommended a upper:lower ratio between 2:1 and 3:1.
Canny Edge Detector — OpenCV 2.4.13.7 documentation

閾値を下げるとノイズを拾いやすくなります。