Javaプログラミングにおける魚眼レンズ画像の変換方法

このQ&Aのポイント
  • Javaプログラミングにおいて、魚眼レンズ画像から通常のレンズ画像への変換方法について教えてください。
  • 現在、私はJavaのプログラミング初心者であり、input画像を魚眼レンズで撮ったような画像から一般的なレンズで撮った画像に変換する方法がわかりません。
  • ソースコードのどの部分を変更すれば、魚眼レンズで撮った画像から通常のレンズで撮った画像に変換できるのか、詳しい手順を教えてください。
回答を見る
  • ベストアンサー

JAVAのプログラミングについて質問です。

現在、あるサイトを参考にして class AppCanvas extends Canvas{ BufferedImage image;//ウィンドウに表示するイメージ //コンストラクタ AppCanvas(){ image=loadImage("input.jpg");//表示用のイメージを取り込み } //イメージをファイルから取り込む BufferedImage loadImage(String name){ try{ FileInputStream in=new FileInputStream(name);//FileInputStreamを作る BufferedImage rv=ImageIO.read(in);//イメージを取り込む in.close();//閉じる return rv;//戻り値に読み込んだイメージをセット }catch(IOException e){ //エラー時の処理(エラーを表示)しnullを返す System.out.println("Err e="+e);//エラーを表示 return null;//null を返す } } //表示の必要があれば実行されるメソッド public void paint(Graphics g){ int x2=getWidth();//画面の幅を取得 int y2=getHeight();//画面の高さを取得 int iw=image.getWidth(this);//イメージの幅を取得 int ih=image.getHeight(this);//イメージの高さを取得 int x0=0;//画面左位置 int y0=0;//画面上端位置 int x1=x2/2;//画面中央位置(横) int y1=y2/2;//画5面中央位置(縦) int sX=300;//画像表示開始位置(水平方向) int sY=300;//画像表示開始位置(垂直方向) int eX=600;//画像表示流量位置(水平位置) int eY=600;//画表示終了位置(垂直位置) g.drawImage(image, x0,y0,x1,y1,this);//画面の左上にイメージを縮小して表示 g.drawImage(image,x1,y1,x2,y2,sX,sY,eX,eY,this);//画面右下に一部を拡大して表示 } } // //WindowAdapterは、WindowListerの機能を持ちますが、 //必要なメソッドだけを書けば、WindowListenerとして使えます // class Adapter extends WindowAdapter { //右上の「×」クリックされると呼び出される public void windowClosing(WindowEvent e){ System.exit(0);//アプリの終了 } } というプログラムを書き、添付した画像のように左上に取りこんだinputの画像、 その右下にその一部を拡大したものを表示、というものになっています。 これを用い、inputの画像を魚眼レンズで撮ったような画像にし、右下に表示される拡大されたものを、 魚眼レンズで撮ったような画像から、一般のレンズで撮ったような画像へ変換して表示したいと考えています。 その場合、どのようにソースコードを書き換えればいいでしょうか? ほとんどプログラミング経験がなく、困っています。

  • esnse
  • お礼率100% (1/1)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

> どのようにソースコードを書き換えればいいでしょうか? ちょいちょいと書き換えて作れる内容ではないですね。Javaの標準機能にそのような画像変形処理はありませんから。 > 魚眼レンズで撮ったような画像から、一般のレンズで撮ったような画像へ変換して表示したい 変換後の画像の各画素を元の画像のどの画素を使ってどのように算出するのか、数学的な表現で定義する必要があります。プログラムを書くのはその後。

esnse
質問者

お礼

いろいろやってみます、有難うございます。

関連するQ&A

  • javaで画像を表示したのですが、変です。

    画像をのせたのですが、表示した画像の透明部分のところに予期しない形で画像が重なってしまいます。 また、ウィンドウのサイズを何回かスクロールしていじると元に戻ります。 文字数の関係ですべてのソースを乗せられないのですが、自作画像クラスだけ記載します。 import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; public class Layer extends JPanel { BufferedImage image; int x=0,y=0; //表示サイズ int lx=0,ly=0; //表示場所 int originalX,originalY; int startX,startY; Layer(){ } public void p(String imgpath,int lX,int lY,int X,int Y){ x=X;y=Y;lx=lX;ly=lY; image=Imagedraw(imgpath); } public void p(String imgpath,int lX,int lY){ lx=lX;ly=lY; image=Imagedraw(imgpath); x=originalX; y=originalY; setSize(x,y); } public void p(String imgpath){ image=Imagedraw(imgpath); x=originalX; y=originalY; setSize(x,y); } public BufferedImage Imagedraw(String imgpath){ BufferedImage img=null; try{ img = readImage(imgpath); }catch(Exception e){ e.printStackTrace(); } setLocation(lx,ly); setSize(x,y); return img; } public void setLocation(int lX, int lY){ lx=lX;ly=lY; super.setLocation(lx,ly); } public void paint(Graphics g){ //イメージを描画 g.drawImage(image,0,0,x,y,startX,startY,x+startX,y+startY,this); } public BufferedImage readImage(String path) throws IOException{ BufferedImage img; img = ImageIO.read(new File(path)); originalX=img.getWidth(); originalY=img.getHeight(); return img; } } どなたか原因に心当たりのある方、よろしくお願いいたします。 なお、画像はインターネット上での拾いものです。書かれた方には感謝いたします。

  • 画像の縮小のプログラムのエラーについて教えて下さい

     java初心者です、宜しくお願いします。  画像の縮小のプログラムを色々と他のサンプルコードとかを参考にしながら 書きましたが、黒い四角形がWindowに表示されるだけです。  プログラム自体のエラーは表示されません。  一体どこが悪いのでしょうか、宜しくお願いします。 ===================================================== public class reSizedIImage extends Applet { Image img ; private MediaTracker tracker; BufferedImage bufimg ; BufferedImage re_img ; public void init() { setBackground( Color.white ) ; img = Toolkit.getDefaultToolkit().getImage( "a.jpg" ) ; tracker = new MediaTracker( this ) ; tracker.addImage( img , 1 ) ; try { // tracker.waitForID( 1 ) ; } catch ( Exception ex ) { ex.printStackTrace() ; } int imgw = img.getWidth( this ) ; int imgh = img.getHeight( this ) ; System.out.println(" imgw = " + imgw + " imgh = " + imgh ) ; int re_width = 300 ; int re_height = 300 ; bufimg = new BufferedImage( img.getWidth( this ) , img.getHeight( this ) , BufferedImage.TYPE_INT_RGB ) ; re_img = new BufferedImage( re_width , re_height , BufferedImage.TYPE_INT_RGB ) ; AffineTransformOp ato = new AffineTransformOp ( AffineTransform.getScaleInstance ( ( double )re_width / img.getWidth( this ) , ( double ) re_height / img.getHeight( this ) ) , null ) ; ato.filter( bufimg , re_img ) ; int re_w = re_img.getWidth(this); int re_h = re_img.getHeight(this); System.out.println(" re_img_w = " + re_w + " re_img_h = " + re_h ) ; } public void paint( Graphics g ) { g.drawImage( re_img , 200 , 200 , this ) ; } }

    • ベストアンサー
    • Java
  • javaのプログラミングについての質問です

    javaのプログラミングについての質問です 任意の複数の数値を入れたファイルを読み取りその数値の場所から次の数値まで線を描画するプログラミングを作成しました ここから発展問題としてタートルグラフィックスを 描画するプログラムを50歩進み右に90度曲がることを4度繰り返すという条件で作ってみようと思ったのですが上手くコンパイルが通りません 取りあえず分かっているのは (100.cos45,100.sin45)で90°曲がる repeat 4,forward 50right 90 end 0 だけです もし分かる方がいらっしゃいましたらご返答宜しくお願いします import java.awt.*; import java.awt.event.*; import java.io.*; public class mondai{ int x[] = new int[100]; int y[] = new int[100]; int len = 0; public static void main(String[] args){ new mondai(args[0]); } public mondai(String mondai2){ ReadFile rf = new ReadFile(mondai2); String line; while( (line = rf.gets()) != null) { String[] date = line.split(","); if(date.length == 2){ x[len] = Integer.parseInt(date[0]); System.out.println(date[0]); y[len]= Integer.parseInt(date[1]); System.out.println(date[1]); len++; } } Frame f = new Frame(); f.setTitle("Line"); f.setSize(640,480); f.setLayout(null); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); }}); DrawArea da = new DrawArea(); da.setBounds(0,0,640,480); f.add(da); f.setVisible(true); } private class DrawArea extends Canvas{ public void paint(Graphics g){ for(int i=0;i<len-1;i++) g.drawLine(x[i],y[i],x[i+1],y[i+1]); } } private class ReadFile{ FileInputStream fis; InputStreamReader isr; BufferedReader br; public ReadFile(String filename){ try{ fis = new FileInputStream(filename); isr = new InputStreamReader(fis); br = new BufferedReader(isr); }catch(Exception e){ e.printStackTrace(); } } public String gets(){ String line = ""; try{ line = br.readLine(); }catch(Exception e){ e.printStackTrace(); } return line; } } }

  • JAVAでの動く波のプログラミング

     Javaのプログラミングに関する質問です。  Javaを勉強中なのですが、sin波を動かす式がどうにも出来ません。以下は私が現状で考えたプログラミングです。 int x1, x2, y1, y2; x2 = getWidth()/5;  y2 = getHeight()/2; for (int i = 1; i <= 90; i++){ x1 = x2; y1 = y2; x2 = x0+(int)(i/30.0*200); y2 =getHeight()/2 -(int)(a*Math.sin(i/30.0*2*Math.PI/T*t)); g.drawLine(x1, y1, x2, y2); }  なんとか独学でこのようなものを考えたのですがまるでダメです。よろしければ止まっている波ではなく動く波のプログラミングの仕方をJavaで教えて頂けると幸いです。

  • イメージのリサイズが表示されない

    JAVA初心者です、宜しくお願い致します。 イメージをリサイズするコードを書きましたが、うまく表示されません。 コードにはエラーは出ていません、原因が分かりません。 ご教示宜しく致します。 ====================================================================== public class reSizedIImage extends Applet { Image img ; private MediaTracker tracker; BufferedImage bufimg ; BufferedImage re_img ; public void init() { setBackground( Color.white ) ; img = Toolkit.getDefaultToolkit().getImage( "a.jpg" ) ; tracker = new MediaTracker( this ) ; tracker.addImage( img , 1 ) ; try { //イメージのロードが完了するまで待機 tracker.waitForID( 1 ) ; } catch ( Exception ex ) { ex.printStackTrace() ; } int imgw = img.getWidth( this ) ; int imgh = img.getHeight( this ) ; System.out.println(" imgw = " + imgw + " imgh = " + imgh ) ; int re_width = 300 ; int re_height = 300 ; bufimg = new BufferedImage( img.getWidth( this ) , img.getHeight( this ) , BufferedImage.TYPE_INT_RGB ) ; re_img = new BufferedImage( re_width , re_height , BufferedImage.TYPE_INT_RGB ) ; AffineTransformOp ato = new AffineTransformOp ( AffineTransform.getScaleInstance ( ( double )re_width / img.getWidth( this ) , ( double )re_height / img.getHeight( this ) ) , null ) ; ato.filter( bufimg , re_img ) ; int re_w = re_img.getWidth(this); int re_h = re_img.getHeight(this); System.out.println(" re_img_w = " + re_w + " re_img_h = " + re_h ) ; } public void paint( Graphics g ) { g.drawImage( re_img , 200 , 200 , this ) ; } }

    • ベストアンサー
    • Java
  • java 初心者です

    javaの勉強しようと思い、ゲームを作ることになったのですが、画像が表示されなくて困っています。 構想としてはメインクラスからフレームクラス(gameFrame)を呼び出し、フレームクラスから画像表示クラス(Layer)を呼び出したいのですが、 Exception in thread "main" java.lang.NullPointerException at Layer.paint(Layer.java:25) at Layer.<init>(Layer.java:17) at gameFrame.newLayer(gameFrame.java:25) at main.main(main.java:9) というエラーが出てうまくいきません。 下記にLayerクラスを載せるのでお願いします。 import java.awt.*; import javax.swing.*; public class Layer extends JPanel{ int x=0; int y=0; private static final long serialVersionUID = 1L; Image image = null; Layer(String img,int X,int Y){ image=roadImage(img); setVisible(true); x=X; y=Y; paint(this.getGraphics()); } public void paint(Graphics g){ System.out.println("ペイント"); System.out.println(image); g.drawImage(image,x,y,this); System.out.println("ペイント終わり"); } static Image roadImage(String path){System.out.println("イメージセット"); if(path == null){ System.out.println("pathはnullです"); } System.out.println("pathは"+path+"です。"); Toolkit kit = Toolkit.getDefaultToolkit(); return kit.getImage(path); } }

  • getWidth();の引数についての質問です

     お早うございます。  getWidth();の引数についての質問です、宜しくお願いします。  ( )内の引数について調べると、「ImageObserver observer」を指定、となっていました。  この意味自体もよく分からないのですが、「パラメータ:observer - イメージがロードされるのを 待機しているオブジェクト」となっていました。  しかし、実際の使い方として、   getWidth( );   getWidth(this);   getWidth(NULL); というコードも見ます。  これって同じ同じ意味なのでしょうか。  getWidth( );は、getWidth(this);の省略形というのも考えられますが、getWidth(NULL);は違う意味のような気がするのです。  「イメージがロードされるのを待機しているオブジェクト」が「NULL」という意味になるのでしょうか。  この「ImageObserver型」についても、今一理解出来なくて・・・・・  どなたか、宜しくご教示下さい。

    • ベストアンサー
    • Java
  • プログラミング☆

    1から10の乱数を 2つ同時に表示しようとしてるのですが、 実行すると2つとも同じ数字になってしまいます。 また、あとでその乱数の合計(=point) をだしたいのでx、yに乱数を代入したいのですがどのように したらいいのでしょうか?? 心やさしい方、お願いします。 #include <stdio.h> #include <stdlib.h> int dice(void); int dice2(void); main() { int x=0,y=0,point; printf("start this game\n"); printf("here is your card\n"); x=dice(); y=dice2(); point=x+y; printf("your card is %d and %d point is %d\n",x,y,point); return 0; } /*ka-do1*/ int dice(void){ srand(time(NULL)); return 1+(rand() % 10); } /*ka-do2*/ int dice2(void){ srand(time(NULL)); return 1+(rand() % 10); }

  • java 画像変換 加工 サイズ変更

    OracleDBからBLOB型の画像データを取得しています。 本来必要のなかった処理なのですが、DBに入っている画像のデータがおかしいらしく、ピクセルとdpiの値を変更しなければなりません。 いろいろと調べてやってみようと思ったのですが、いきづまってしまいました(><) みなさんの力をお貸しください。 内容は、 ・一度DBからそのまま画像を抽出し、ファイルを作成 ・作成したファイルをもう一度BufferedImageに取り込み、サイズ変更処理開始 となっています。 しかし、BufferedImageに取り込む際に、nullが帰ってきてしまい、以降の処理ができません・・・。 また、下記処理はすべてjpgで行っていますが、本当はTiffファイルを作りたいのです。 ImageIOクラスは標準ではTiffは対応していないようなのですが、実際に下記ソースの"jpg"を"tif"に変更しても問題はないのでしょうか? 質問が煩雑で申し訳ないですが、よろしくお願いいたします。 以下ソース抜粋です。 ---------------------------------------------------------------- ImageOutNum = (String)rs.get("IMAGEGRPNO"+i)+"_"+(String)rs.get("IMAGENO"+i); // イメージファイルを作成する。 File imagef = new File(outPath2); if(!(imagef.exists()))imagef.mkdirs(); InputStream inImage = (InputStream)rs.get("IMAGEFILE"+i); if (inImage != null) { FileOutputStream outImage = new FileOutputStream(outPath2 + ImageOutNum + ".jpg"); //画像書き込み int j; while ((j = inImage.read()) != -1) { outImage.write(j); } // 解放 outImage.close(); //イメージ変更処理 InputStream orgImageFile = null; orgImageFile = new FileInputStream(outPath2 + ImageOutNum + ".jpg"); BufferedImage orgImage = ImageIO.read(orgImageFile);//ここでorgImageにnullが返されてしまいます。 int width = 640; int height = (int)(((double)width / orgImage.getWidth()) * (double)orgImage.getHeight()); BufferedImage resizeImage = new BufferedImage(width, height, orgImage.getType()); // ここからリサイズ処理 AffineTransformOp ato = null; ato = new AffineTransformOp( AffineTransform.getScaleInstance((double)width / orgImage.getWidth(),(double) height / orgImage.getHeight()),null); ato.filter(orgImage, resizeImage); // ここまでリサイズ処理 ImageOutputStream imageStream = ImageIO.createImageOutputStream(new File(outPath2 + ImageOutNum + ".jpg")); ImageWriter writer = null; Iterator it = (Iterator) ImageIO.getImageWritersByFormatName("jpg"); writer = (ImageWriter) it.next(); writer.setOutput(imageStream); JPEGImageWriteParam jpgWriter = new JPEGImageWriteParam(Locale.getDefault()); jpgWriter.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); jpgWriter.setCompressionQuality(1f); writer.write(null, new IIOImage(resizeImage, null, null), jpgWriter); imageStream.flush(); writer.dispose(); imageStream.close();

  • javaについて質問です。

    import javax.swing.*; import java.awt.*; import java.awt.event.*; class MoveField extends JPanel {       private int xc;       private int yc;       int d = 50;       Color c=Color.red;       int pause =1000;       boolean cont=true; thread th;       MoveField(){}       MoveField(int d){this.d=d;}       MoveField(int d,Color c){this(d);this.c=c;}       boolean isHit(int x,int y){             int w=(x-xc)*(x-xy)+(y-yc)*(y-yc);             if(w<=d*d){return true;}       return false; }       void start(){             cont=true; th= new Thread(this);             th.start(); } void stop() {cont=false:} public void run(){ when(cont){ int x=0 int y=0 if(Math.random()<0.5){x=(int)(Math.random()*(getWidth()-d));} if(Math.random()<0.5){y=(int)(Math.random()*(getHeight()=d));} xc=x; xy=y; repaint(); try{Thread.sleep(pause);}catch(Exception e){} } } @Override public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,getWidth(),getHeight()); gsetColor(c); g.fillOval(xc,yc,d,d); } } class MoveHit extends JFrame impkements ActionListener{ MoveField field; JTextField txt; nt pt=0; MoveHit(){ setDefaultCloseOperation(EXIT_ON_CLOSE); field=new MoveField(); add(field); JPanel p=new JPanel(); p.add(new Jlabel("Point")); txt=new JTextField(20); p.add(txt); add(p.BorderLayout.NORTH); p=new JPanel() JButton b; b=new JBotton("Start");b.addActionListener(this);p.add(b); b=new JBotton("Stop");b.addActionListener(this);p.add(b); add(p, BorderLayout.SOUTH); }   @Override public void actionPerformed(ActionEvent ev){ string cmd=ev.getActionCommand(); if(cmd.epuals("Stop")){ pt=0; txt.setText(""); Field.start(); } elese if(cmd.equals("Stop"))field.stop(); } public void mouseClicked(MouseEvent ev){ int x=ev.getX(); int y=ev.getY(); if(field.isHit(x,y)){ pt++; Toolkit.getDefaultToolkit().beep(); txt.setText(""+pt); } } public void mousePressed(MouseEvent ev){} public void mouseReleased(Mousevent ev){} public void mouseEntered(MouseEvent ev){} public void mouseExited(MouseEvent ev){} public static void main(String [] args){ MoveHit tx=new MOveHit(); tx.setSize(600,500); tx.setVisible(true); } } このプログラムがうまく作動しません。 エラーは 1.MoveHit.java:30: ';' がありません。 void stop() {cont = false:} 2.MoveHit.java:33: ';' がありません。 when(cont){ 3.MoveHit.java:46: 注釈は -source 1.4 でサポートされていません (注釈を使用可能にするには、-source 1.5 を試してください) @Override 4.MoveHit.java:55: '{' がありません。 class MoveHit extends JFrame impkements ActionListener { です。 また、MoveHitクラスがマウスイベントの処理に対応していないらしいので改善したいです。 ほかに修正点があれば教えてほしいです。協力お願いします。

専門家に質問してみよう