エフェクト 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 (ジャンプコミックス)

STEEL BALL RUN スティール・ボール・ラン 18 (ジャンプコミックス)

JOJO史上最『奇妙』!!
『挟まれろ』!葛藤の先にこそ違う世界があるッ!


『いともたやすく行われるえげつない行為(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


埋まった!やったね!

モンスターハンターG(wii) 雑感

モンスターハンターG発売から約二週間経ったので、全くの未経験からそれなりにやってみた雑感。

リオレイアリオレウス 堂々とした歯並び。王道。

ディアブロス しっかりとした歯並び。自己主張の激しい上の歯。

フルフル 独特の歯並び。歯がギザギザしていて地味に一番痛そう。

ゲリョス 歯並びと歯の色が悪い。

イャンクック そもそも歯が無い。

macbookのソフトウェアベースステーション機能を使ってwii、DSをネットに接続する。

最近wiiモンスターハンターGをやっている。
wii無線LAN接続方法にmacbookのソフトウェアベースステーション機能を使っているのでその設定方法を書く。
macOSXのソフトウェアベースステーション機能は、AirMacカードをアクセスポイントにすることが出来る機能。

家はフレッツ光なんだけど、フレッツ光の接続方式はPPPoE。
wiiは何故かPPPoEに対応していないのでルータを間に入れるか、アクセスポイントを用意してルータ的な役割をさせないと接続できない。フレッツ光wiiへの接続サービスみたいなものをやっているみたいだけど、あれはwiiとPPPoEの接続設定の複雑さを逆手に取ったサービスなのだと思う。

macbook側の設定

  • システム環境設定→共有→インターネット共有を選択

  • 共有する接続経路を選択
  • 相手のコンピュータが使用するポートにAirMacを選択
  • AirMacオプションを選択

  • ネットワーク名を設定(英数字以外だとwii、DSで設定が出来ないようなので注意)
  • WEPキーに128ビットを選択
  • 13文字のWEPキーを設定
  • インターネット共有を開始

wii側の設定

  • 左下のwiiオプション→wii本体設定→インターネット→接続設定
  • 適当な未設定の接続先を選択
  • wifi接続を選択
  • アクセスポイントを検索
  • さっき設定したアクセスポイントを選択
  • WEPキーを入力

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

結果。美白処理!

おまけ。
ホリーさんの服だけ色を変えたりとかも出来る。