HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0307
Hello円形画像のパノラマ画像への変形6解決


Hello

リンク

2013/3/7(Thu) 15:24:31|NO.52753

下の様な全方位カメラで取られた写真を
長方形のパノラマ写真に変換する方法は、どのようにやるのが良いのでしょうか?
http://yokoya.naist.jp/~yamazawa/pictures/vcm_s_kf_repr.jpg

grotateで、四角い画像を丸くすることはできるようなのですが、
その逆をしたいので、サンプルソースなど示していただけると幸いです。



この記事に返信する


kanahiron

リンク

2013/3/7(Thu) 15:57:14|NO.52754

面白そうなので標準命令だけでやってみました


pfn = "vcm_s_kf_repr.jpg" screen 1 picload pfn b1ssx = ginfo(12) b1ssy = ginfo(13) screen 0,1000,(b1ssy/2) px2 = (b1ssx/2) py2 = (b1ssy/2) rag = 0.0 ragadd = 0.0062831853072 repeat 1000 ycnt = cnt px = double(b1ssx/2) py = double(b1ssy/2) repeat (b1ssy/2) px += sin(rag) py += cos(rag) gsel 1 pget px,py cr = ginfo_r:cg = ginfo_g:cb = ginfo_b gsel 0 color cr,cg,cb pset ycnt,py2-cnt await loop rag += ragadd loop
例にあげてもらった画像を使用しています
ただ作ってみただけなので、自分なりに改造してから使ってください
とは言っても参考にもならないかもしれませんがw(ゴリ押しだから)



Hello

リンク

2013/3/7(Thu) 17:16:42|NO.52756

>>kanahironさん
ありがとうございます!
実行速度がかなり重いですが、イメージはこんなかんじです!

欲を言えば、全方位動画用に使いたいので
毎秒30fpsぐらいで処理できたら良いなと思うのですが、
gsquareで、ケーキの用に割っていくことはできないでしょうか?



YSR

リンク

2013/3/7(Thu) 18:47:25|NO.52767

>毎秒30fpsぐらい
HSPにそんな速度を期待すんなよ……
HSPからは外れるが、
http://mobilehackerz.jp/contents/Software/panoramaLive
みたいなのを使えばおk?



kanahiron

リンク

2013/3/7(Thu) 20:39:39|NO.52779

重いのは、pset/pgetが原因です
vramからpeek/pokeでやれば数倍早くなります
redrawを使えばpset/pgetでも多少早くなるでしょう
それでも1〜5fpsが限界ですが



暇人

リンク

2013/3/7(Thu) 22:54:10|NO.52786

>gsquareで、ケーキの用に割っていくことはできないでしょうか?
出来るけどgsquareの変形はあまり綺麗じゃない・・・


pfn = "vcm_s_kf_repr.jpg" screen 1 picload pfn b1ssx = ginfo(12) b1ssy = ginfo(13) xsiz=b1ssx/2 ysiz=b1ssy/2 hsiz=ysiz //変換後の画像の高さ(これを基準に変換後のウィンドウサイズにする) setr=deg2rad(5) //分割角度 cntmax=int(M_PI*2.0/setr) //分割数 winx=(M_PI*hsiz) //変形後のウィンドウサイズ w=winx/cntmax //変形後分割サイズ dx=0,0,0,0 //コピー先座標 dy=0,0,hsiz,hsiz screen 0,int(winx),hsiz r= deg2rad(0) //開始角度(0で↓) wx=0.0 line_f=1 //分割ライン表示 repeat cntmax dx=int(wx),int(wx+w),int(wx+w),int(wx) wx+w //次のコピー先座標 sinx=sin(r) //コピー元の最初の座標 cosy=cos(r) r+setr //左回り sinx2=sin(r) //コピー元の2番目の最初の座標 cosy2=cos(r) sx=int(sinx*xsiz+xsiz) ,int(sinx2*xsiz+xsiz),xsiz,xsiz sy=int(cosy*ysiz+ysiz) ,int(cosy2*ysiz+ysiz),ysiz,ysiz gsel 0 gsquare 1,dx,dy,sx,sy if line_f { gsel 1 color 128 line int(sinx*xsiz+xsiz),int(cosy*ysiz+ysiz),xsiz+sinx*50,ysiz+cosy*50 //分割ライン } loop if line_f { color 255,255 line int(sinx2*b1ssx+xsiz),int(cosy2*b1ssy+ysiz),xsiz,ysiz //最終ライン } stop



YSR

リンク

2013/3/10(Sun) 23:43:36|NO.52867

>HSPにそんな速度を期待すんなよ……
とか言いましたが、とりあえず作ってみました。

;画面中央を原点と仮定して、極座標変換して表示する #uselib "winmm.dll" #func global timeBeginPeriod "timeBeginPeriod" sptr #func global timeEndPeriod "timeEndPeriod" sptr #cfunc global timeGetTime "timeGetTime" #define PI 3.141592 timeBeginPeriod 1 ;読み込み ;バッファに読み出し time1=timeGetTime() buffer 1 :picload "vcm_s_kf_repr.jpg" px=ginfo(12) :py=ginfo(13) ;配列に画像数値データを格納 ;・左下から逆Z字形に走査される ;・色データはBGRの順番 dim piccolor,px,py,3 mref vram,66 index=0 repeat py y=cnt repeat px piccolor.cnt.y.0=peek(vram,index) piccolor.cnt.y.1=peek(vram,index+1) piccolor.cnt.y.2=peek(vram,index+2) index+=3 loop loop time2=timeGetTime() ;極座標変換 ;中央座標を計算 cx=px/2 :cy=py/2 ;極座標変換後の画像サイズを決定 if cx>cy :py2=cx :else :py2=cy px2=int(PI*2*py2) ;変換 buffer 2,px2,py2 mref vram,66 index=0 ddim putcolor,2,3 repeat py2 y=cnt repeat px2 degrees=PI*2*cnt/px2 x_=sin(degrees)*y+cx y_=-cos(degrees)*y+cy putx=int(x_) :puty=int(y_) poke vram,index,piccolor.putx.puty.0 poke vram,index+1,piccolor.putx.puty.1 poke vram,index+2,piccolor.putx.puty.2 index+=3 loop loop time3=timeGetTime() screen 0,px2/2,py2 gzoom px2/2,py2,2,0,0,px2,py2,1 time4=timeGetTime() title "展開・変換・表示:"+(time2-time1)+"・"+(time3-time2)+"・"+(time4-time3)+"ms" timeEndPeriod 1 stop
自環境(Core i5-3210M)で変換に1000msほど掛かってる……



ONION software Copyright 1997-2023(c) All rights reserved.