エフェクト AfterImageSliceを作ってみた。
ActionScript3で、Webカメラの映像にエフェクトをかけてみた。
僕が知らないだけかもしれないが、同じようなエフェクトが無いようなのでAfterImageSliceと名付けた。
ソースは以下。
10フレーム前までの映像をコピーしておいて、一列ごとに最新〜10フレーム前までのいずれかの映像をあてはめる。
package { import flash.display.*; import flash.events.*; import flash.media.*; import flash.filters.*; import flash.geom.*; public class Slice extends Sprite { private var bd:BitmapData; private var bdCopyArray:Array; private var video:Video; private var bitmap:Bitmap; private var count:int private var sliceArray:Array public function Slice(){ bd = new BitmapData(640, 480, false, 0x00000000); bdCopyArray = new Array(); sliceArray = new Array(); for(var i:int = 0; i < 480; i++){ bdCopyArray.push(new BitmapData(640, 480, false, 0x00000000)); sliceArray.push(Math.floor(Math.random() * 10)); } bitmap = new Bitmap(bd); addChild(bitmap); addEventListener(Event.ENTER_FRAME, onEnterFrame); var camera:Camera = Camera.getCamera(); if(camera != null){ camera.setMode(640, 480, 15); camera.setMotionLevel(10); camera.setQuality(0, 10); video = new Video(640, 480); video.attachCamera(camera); } } public function onEnterFrame(evt:Event):void { count++; bd.draw(video); bdCopyArray[count%10] = bd.clone(); for(var i:int = 0; i < 480; i++){ bd.copyPixels(bdCopyArray[sliceArray[i]],new Rectangle(0,i,640,1),new Point(0,i)); } } } }
Steel Ball Run 18巻
ネタバレが少しあります。
STEEL BALL RUN スティール・ボール・ラン 18 (ジャンプコミックス)
- 作者: 荒木飛呂彦
- 出版社/メーカー: 集英社
- 発売日: 2009/07/03
- メディア: コミック
- 購入: 6人 クリック: 53回
- この商品を含むブログ (92件) を見る
『挟まれろ』!葛藤の先にこそ違う世界があるッ!
『いともたやすく行われるえげつない行為(D4C)』とは、何ら過不足無く大統領のことであった!!
自分自身を捨てることによって全てを得ようとする大統領!
飢えるとは!『気高く飢える』とはッ!捨てることでは無い!『差し出す』ことなのだ!
そして大統領の向かう『最後の土地』とは一体!?
予測など『出来るわけが無い』!
そして作者コメントで触れられていたあの男!その偉業に僕は敬意を表するッ!
RMagickで画像を魚眼風に変換してみた。
普通の画像を魚眼レンズで撮った画像みたいに変換してみた。
画像の中心点を基準にして
点xの変換前の距離をd
変換後の距離をd'
焦点距離をf
魚眼レンズの半径をrとすると、座標の変換式は以下。
d' = (r*d) / (f^2 + d^2)^(1/2)
この変換式を使って処理する。
require 'rubygems' require "RMagick" include Magick def fisheyeconvert(image, filename, f, r) black = Magick::Pixel.new(0, 0, 0) img = ImageList.new(image) generate_img = Image.new(img.columns, img.rows) center_x = img.columns/2 center_y = img.rows/2 for y in 0...img.rows for x in 0...img.columns dx = x - center_x dy = y - center_y d = Math.sqrt(dx*dx + dy*dy) cx = (r*dx / (Math.sqrt(f*f + d*d)) + center_x).round cy = (r*dy / (Math.sqrt(f*f + d*d)) + center_y).round src = img.pixel_color(x, y) color = Magick::Pixel.new(src.red, src.green, src.blue) generate_img.pixel_color(cx, cy, color) end end generate_img.write filename end image = ARGV[0] filename = ARGV[1] f = ARGV[2] r = ARGV[3] fisheyeconvert(image, filename, f.to_i, r.to_i)
さて、今回の実験画像はこちら。
菊丸印のステップが踏めます。デスメタルおじさんです。
ruby ./fisheyeconvert.rb deathmetal_fisheye.jpg 230 400
なんか白い!変換した際に、対応しなかった点には何も割り振られてない様子。
なので超適当に補間処理を追加。
対応しなかった点には周りの平均値を割り当てる。
require 'rubygems' require "RMagick" include Magick def fisheyeconvert(image, filename, f, r) black = Magick::Pixel.new(0, 0, 0) img = ImageList.new(image) generate_img = Image.new(img.columns, img.rows) interpolation_img = Image.new(img.columns, img.rows) center_x = img.columns/2 center_y = img.rows/2 for y in 0...img.rows for x in 0...img.columns dx = x - center_x dy = y - center_y d = Math.sqrt(dx*dx + dy*dy) cx = (r*dx / (Math.sqrt(f*f + d*d)) + center_x).round cy = (r*dy / (Math.sqrt(f*f + d*d)) + center_y).round src = img.pixel_color(x, y) color = Magick::Pixel.new(src.red, src.green, src.blue) generate_img.pixel_color(cx, cy, color) interpolation_img.pixel_color(cx, cy, black) end end for y in 0...generate_img.rows for x in 0...generate_img.columns src = interpolation_img.pixel_color(x, y) if src.red == 255 r_array = Array.new g_array = Array.new b_array = Array.new for py in y-2...y+2 for px in x-2...x+2 check_img = interpolation_img.pixel_color(px, py) if check_img.red == 0 pixel = generate_img.pixel_color(px, py) r_array << pixel.red g_array << pixel.green b_array << pixel.blue end end end if r_array.size != 0 mr = r_array.inject(0){|r,i| r+=i }/r_array.size mg = g_array.inject(0){|r,i| r+=i }/g_array.size mb = b_array.inject(0){|r,i| r+=i }/b_array.size interpolation_color = Magick::Pixel.new(mr, mg, mb) generate_img.pixel_color(x, y, interpolation_color) end end end end generate_img.write filename interpolation_img.write "test2.jpg" end image = ARGV[0] filename = ARGV[1] f = ARGV[2] r = ARGV[3] fisheyeconvert(image, filename, f.to_i, r.to_i)
ruby ./fisheyeconvert.rb deathmetal_fisheye2.jpg 230 400
macbookのソフトウェアベースステーション機能を使ってwii、DSをネットに接続する。
最近wiiのモンスターハンターGをやっている。
wiiの無線LAN接続方法にmacbookのソフトウェアベースステーション機能を使っているのでその設定方法を書く。
macOSXのソフトウェアベースステーション機能は、AirMacカードをアクセスポイントにすることが出来る機能。
家はフレッツ光なんだけど、フレッツ光の接続方式はPPPoE。
wiiは何故かPPPoEに対応していないのでルータを間に入れるか、アクセスポイントを用意してルータ的な役割をさせないと接続できない。フレッツ光はwiiへの接続サービスみたいなものをやっているみたいだけど、あれはwiiとPPPoEの接続設定の複雑さを逆手に取ったサービスなのだと思う。
macbook側の設定
- システム環境設定→共有→インターネット共有を選択
- ネットワーク名を設定(英数字以外だとwii、DSで設定が出来ないようなので注意)
- WEPキーに128ビットを選択
- 13文字のWEPキーを設定
- インターネット共有を開始
wii側の設定
DS側の設定(テトリスDSの場合)
- 適当な未設定の接続先を選択
- アクセスポイントを検索→さっき設定したアクセスポイントを選択
- WEPキーを入力(この時の接続テストは失敗するので、改めて設定を編集)
- IPアドレス自動取得を「しない」に変更
- IPアドレスを10.0.2.xxx(10.0.2.10とか)に設定
- サブネットマスクを255.255.255.0に設定
- ゲートウェイを10.0.2.1に設定
- プライマリDNSを10.0.2.1に設定
- セカンダリDNSを10.0.2.1に設定
この記事を書くために久しぶりにテトリスDSをやったら、wifi対戦ですぐに相手が見つかってびっくりした。
すげえなあ。まだやってる人は多いんだなあ。
そして気がついたら数時間経っていたことにもっとびっくりした。
今!確実に時間が飛ん
RMagickでモザイク処理をしてみた。
像。
モザイク処理をしてみた。
例えばモザイクの単位を5ピクセルにする場合
縦5ピクセル、横5ピクセルの5*5マスのRGB値平均値を算出。
該当範囲をその色で塗りつぶす。
require 'rubygems' require "RMagick" include Magick def mozaic(image, filename, per) img = ImageList.new(image) px = (img.columns / per).ceil py = (img.rows / per).ceil for y in 0...py+1 for x in 0...px+1 tx = x * per ty = y * per r_array = Array.new g_array = Array.new b_array = Array.new for iy in 0...per for ix in 0...per pixel = img.pixel_color(tx+ix, ty+iy) r_array << pixel.red g_array << pixel.green b_array << pixel.blue end end mr = r_array.inject(0){|r,i| r+=i }/r_array.size mg = g_array.inject(0){|r,i| r+=i }/g_array.size mb = b_array.inject(0){|r,i| r+=i }/b_array.size color = Magick::Pixel.new(mr, mg, mb) for iy in 0...per for ix in 0...per img.pixel_color(tx+ix, ty+iy, color) end end end end img.write filename end image = ARGV[0] filename = ARGV[1] per = ARGV[2] mozaic(image, filename, per.to_i)
本日の実験画像は……おや…?
おやおや…?
これは…まさか…?
RMagickで特定の色を基準に色置換をしてみた。
画像。
指定したRGB値を基準に色を置換する。
特定の色だけ自然な感じで変えたい時に使える。かもしれない。
require 'rubygems' require "RMagick" include Magick def colorconvert(image, filename, r, g, b) # 置換するRGB値 cr = 255 cg = 255 cb = 220 img = ImageList.new(image) for y in 0...img.rows for x in 0...img.columns src = img.pixel_color(x, y) dr = src.red - r dg = src.green - g db = src.blue - b # 基準RGB値からの色距離(基準色からどれだけ離れているか)を算出 d = Math::sqrt(dr*dr + dg*dg + db*db) # 影響力調整 d = d / 200 # 基準RGB値に近い(色距離が小さい)ほど、RGB値補正の影響を大きく受ける if d <= 1 nr = src.red - ((src.red-cr) * (1-d)*(1-d)) ng = src.green - ((src.green-cg) * (1-d)*(1-d)) nb = src.blue - ((src.blue-cb) * (1-d)*(1-d)) color = Magick::Pixel.new(nr, ng, nb) img.pixel_color(x, y, color) end end end img.write filename end image = ARGV[0] filename = ARGV[1] # 基準RGB値 r = ARGV[2] g = ARGV[3] b = ARGV[4] colorconvert(image, filename, r.to_i, g.to_i, b.to_i)
今回の実験画像はこちら。
エキゾチックなハイスクールブシドー、シノブさんです。
今回はその褐色の肌を基準値にしてみます。
ruby ./colorconvert.rb image/shinobu.jpg shinobu_convert.jpg 129 112 102