uoz 作業日記

様々な作業の記録を共有するブログです。

Servletでつくった、Webカメラで撮影した画像をたくさんの数字で再現したのを返してくれるWebアプリ

http://uozias.hatenablog.com/entry/2014/02/25/HTML5_canvas%E8%A6%81%E7%B4%A0%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81Web%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%A7%E6%92%AE%E5%BD%B1%E3%81%97%E3%81%9F%E7%94%BB%E5%83%8F%E3%82%92OpenCV%E3%81%A7
この記事の続き



http://d.hatena.ne.jp/antlabo/20110611/1307768591
この人が結構やっているんだけど、ある画像を別の小さな画像のあつまりで再現するという処理。
常用漢字モナリザをつくったりしてて、面白い。

このコードをそのままこぴぺして、前に作ったWebカメラから写真を取得して処理するアプリに組み込んでみた。

前のサーバーサイドはrailsだったけど、画像検索のライブラリLIREhttp://www.semanticmetadata.net/lire/を使うために、javaにしなきゃということで、
サーブレットに作り直した。

アプリのデモはここで公開しています。(そのうちやめるかもしれないけど)
http://www.saizo-aoyagi.jp:8080/Collage2/


f:id:uoz:20140320172224p:plain


Webカメラの画像は、WebRTC APIを使って取得する。
これについては、一番上のリンク先参照。



画像を処理するサーブレットのメインのコード

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//ポストされてきたデータをBase64でコード
		String val = request.getParameter("imageData");
		byte[] decoded = Base64.decode(val);
		InputStream in = new ByteArrayInputStream(decoded);



		//レスポンスは字で返す
		response.setContentType("text/plain");
		BufferedImage readImage = null;


		//レスポンスから
		PrintWriter printWriter = response.getWriter();

		try {


			//送られてきたファイルを画像に
			readImage = ImageIO.read(in);

			//出力ストリームつくる
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			BufferedOutputStream bos = new BufferedOutputStream(baos);


			//コラージュ作る
			String realPath2 = this.getServletContext().getRealPath(Collage.INDEX_PATH_IN_SERVLET);
			Collage.createCollageInServlet(readImage, bos, realPath2);


			readImage.flush();
			bos.flush();
			bos.close();


			byte[] bImage = baos.toByteArray();
			String byteString =Base64.encode(bImage);

			//文字列出力
			printWriter.write(byteString);

			//画像出力
			//ImageIO.write(readImage, "gif", out);
		} catch (Exception e) {
			e.printStackTrace();
			readImage = null;
		}

	}

こいつがたたいている、コラージュを作る関数(これはほぼ参考サイトのコピペ)

public static void createCollageInServlet(BufferedImage bimg, BufferedOutputStream bos, String indexPath) throws IOException{
		// 検索対象のIndexを読むReaderを作る
		IndexReader reader = IndexReader.open(FSDirectory.open(new File(indexPath)));
		ImageSearcher searcher = ImageSearcherFactory.createDefaultSearcher();

		//白い画像を作る
		BufferedImage imageBlank = new BufferedImage(bimg.getWidth(),
				bimg.getHeight(), BufferedImage.TYPE_INT_RGB);
		Graphics2D gr = imageBlank.createGraphics();
		gr.setColor(Color.WHITE);
		gr.fillRect(0, 0, bimg.getWidth(), bimg.getHeight());

		for (int i = 0; i < ROOP; i++) {
                    //ここは参考サイトのコピペ
	

		}

		gr.dispose();
		ImageIO.write(imageBlank, "png", bos);


	}

文字列をBase64エンコード、デコードするとか、byteの配列にするとか、なんかややこしかった。
画像処理のコラージュ作る部分も自分なりの何かに置き換えたら、コード全体を公開しようと思う



この内容とあまり関係ないが、javaによる画像処理の本紹介。
実際に呼んだのはこれ。
あんまり詳しくない初心者向けだが、初心者なので役に立った本。古いので中古しかない。

楽しく学ぶJavaではじめる画像処理プログラミング

楽しく学ぶJavaではじめる画像処理プログラミング


こっちはあるらしい。

Javaによる画像処理プログラミング (I・O BOOKS)

Javaによる画像処理プログラミング (I・O BOOKS)