ツナドーナツ・技術メモ帳

色々なものを作る過程で分からなかったことなどを書いていきます

Electron始めました。

以前作りかけで終わったブラウザ版ノベルゲーをwindowsアプリで作りたいと思い、とうとうElectronに手を出してしまいました。
「就活はいいのかよ」「もっとちゃんと就活しろよ」
その通りです。
でも僕はプログラミングがしたい。

こちらのサイトを参考にしたらすんなりいけました。
ics.media

で、ここからが問題です。
Electron 入門 でグーグル先生に聞いても環境構築とか独自関数とかしかでてこない。

それで気づきました。
あ、これひょっとしてHTML書いたらそのままアプリになるんじゃないか?

マジでなりました。
f:id:iwanax:20180403214156p:plain

↑のやつはHTMLとJavaScriptしか使っていません。
ブラウザゲーム作ったらWindowsアプリになった感じです。
なるほどこれがElectronか。素晴らしい!

ということは、phina.jsも使えるのでは?

結論から言うと、使えますが使う意味はあまりない気がします。
phina.jsでPCゲーム作りたいっていうならアリですが、そうじゃないなら素直にUnity使ったほうがいい気がします。

あと、phina.jsが使えるということは他のライブラリも使えるということです。
なのでBootStrapを使ったホームページメイカーみたいなのとかも作れるってことになります。
自分の父親が欲しがっていたので今度作ってあげるのもいいかもしれません。

ということで今回はこのへんで。

アニメ画像の輪郭を取る

膨張させて元画像引くと輪郭が取れるやつやりました(この方法の名称わからない)

ソースコード

#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

#pragma comment(lib, "opencv_world300d.lib")

int main(int argc, char *argy[]){
	cv::Mat src_img = cv::imread("画像のパス");
	cv::Mat gray;
	cv::cvtColor(src_img, gray, CV_RGB2GRAY);

	cv::Mat dilate_img;
	cv::dilate(gray, dilate_img, cv::Mat(), cv::Point(-1, -1), 1);

	cv::Mat result = dilate_img - gray;

	cv::namedWindow("image1");
	cv::namedWindow("image2");
	cv::imshow("image1", src_img);
	cv::imshow("image2", result);
	cv::waitKey(0);

	cv::imwrite("保存先のパス", result);
	return 0;
}

f:id:iwanax:20180131215444j:plainf:id:iwanax:20180131215427j:plain

RGB成分に分解してやったらもっときれいに輪郭取れるかもしれない。

Raspberry Pi3を動かす

HDMIケーブルが家にあったのでそれを使うことにしました。

基本的にこちらのサイトを見てSDカードの初期設定を行いました。
http://www.hiramine.com/physicalcomputing/raspberrypi2/setup_sdcard.html

では早速起動してみます。
f:id:iwanax:20180120224825j:plain

OSはRaspbianを選びます。Lite版は今回は選びません。
SDカードの性能によってインストール時間が変わります。
僕の場合は大体30分くらいでした。
f:id:iwanax:20180120224802j:plain

OKを押すと↓のような画面になります。
f:id:iwanax:20180120225040j:plain

なんか怖いですが気にしない
f:id:iwanax:20180120225201j:plain

起動しました。
f:id:iwanax:20180120225256j:plain

早速ターミナルを開いて、ソフトを更新します。
sudo apt-get update
f:id:iwanax:20180120225347j:plain

終わったらsudo apt-get upgrade
ファームウェアも更新しときます。
sudo rpi-update

これであとはpiユーザのパスワードを変えて終了。

ちなみにssh接続をする際はメニューのraspberry piの設定からsshを有効にしておかないと拒否られます。
今回僕は日本語の設定をした覚えはないのですが、インストールの際にあったLanguageをEnglishから日本語に変えたらインストール後の設定も全部日本語になっていました。
でも日本語入力をすることはできませんでした。

HDMIケーブル買うの忘れてた

旅行から帰ってきたのでラズパイを動かそうとしたら、ラズパイのHDMIケーブル買うの忘れてました。
amazonで買おうかと思いましたが、そこら辺のホームセンターに売ってそうなのでそっちで買います。
なんで明日か明後日位にラズパイの話をすることになりそうです。

ラズベリーパイを買った

Raspberry Pi3 を買いました。

前から買おうと思っていたラズベリーパイをやっと買いました。
本体と電源のセットで5940円です。
Amazon CAPTCHA
f:id:iwanax:20180115210132j:plain


マイクラサーバーを立てるつもりなので、ケースとヒートシンクとファンも買いました。
こちらは998円です。
https://www.amazon.co.jp/gp/product/B073HYFZRC/ref=oh_aui_detailpage_o00_s01?ie=UTF8&psc=1
f:id:iwanax:20180115211154j:plain

microSD東芝の16GBのものを買いました。1023円でたぶん普通です。
https://www.amazon.co.jp/gp/product/B019RE5Y96/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1
f:id:iwanax:20180115211327j:plain

とりあえずケースを取り付けてみる

実は明日から旅行に行くので、環境設定する余裕がありませんでした(笑)
なので、今回はケースの取り付けだけになります。

意気揚々とケースを分解。
f:id:iwanax:20180115211917j:plain

早速説明書を見ますが・・・

f:id:iwanax:20180115212253j:plain
ケース説明書
よう分からん。なにこれ。

適当に組み立てていきます。
とりあえず板の形を見てどこのパーツか推測。
f:id:iwanax:20180115212707j:plain
多分、というか絶対ここだと思う。

次は説明書の②のパーツ
f:id:iwanax:20180115213007j:plain

これは基盤の裏面につけるパーツでした。
説明書①の前に取り付けるパーツのようです。
f:id:iwanax:20180115213143j:plain

絶対ここだと言っておきながら早速間違えました。

次は基盤の表面です。
③→④→⑤の順番でつけていきます。この順番でつけないと充電口が塞がってしまうようです。

f:id:iwanax:20180115213658j:plain
③④⑤を付けた後

ねじの向きがおかしいですがこんな感じです。
もうお気づきの方もいらっしゃると思いますが、ファンを取り付ける穴の位置がかなりずれています。
でもまあ、風は当たると思うので許容範囲でしょう。ぶっちゃけ安かったので別にいいです。

あとはヒートシンクを付けて
f:id:iwanax:20180115214342j:plain


一応ファンも取り付けます。

f:id:iwanax:20180115214256j:plain
追記:ファンを上下逆さまに取り付けていたようです(すみません)
   あとファン取り付けたらちょうどよかったです。

次回はmicroSDカードにOSを入れて環境設定を行っていきたいと思います。

JavaScriptでローカルの画像を読み込んで表示する方法

僕がよく使っていた、JavaScriptで画像処理のやり方を紹介していたサイトが消えてしまったので自分で調べて作ってみることにしました。
こういう感じで表示させます。
f:id:iwanax:20180114182001g:plain
inputタグを使って読み込んだファイルをcanvasに表示する方法です

ソースコード

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>ファイル読み込み</title>
</head>
<body>
	<canvas id="canvas"></canvas>
	<input type="file" id="self">
	<script>
	//キャンバスタグ読み込み
	var canvas = document.getElementById("canvas");
	//描画機能を有効にする
	var ctx = canvas.getContext('2d');
	//inputタグの読み込み
	var src = document.getElementById("self");

	//inputが変更されたときのイベントを登録
	src.addEventListener('change', function(event){
		//選択ファイルを配列形式で取得
		var file = event.target.files;
		//ファイルリーダー
		var reader = new FileReader();

		//ファイルを読み込む
		reader.readAsDataURL(file[0]);

		//ファイルを読み込んだときの処理
		reader.onload = function(){
			//画像オブジェクト作成
			var img = new Image();
			//画像ソースを入れる
			img.src = reader.result;
			//画像の表示
			img.onload = function(){
				canvas.width = img.width;
				canvas.height = img.height;
				ctx.drawImage(img, 0, 0);
			}
		}
	}, false);
	</script>
</body>
</html>

OpenCVできのこの輪郭を取る

OpenCVを使ってキノコのエッジを取っていきます。

OpenCVのバージョン:2.4.13

使う言語:C++

f:id:iwanax:20180113133122j:plainf:id:iwanax:20180113133051j:plain

こんな感じできれいにキノコのエッジを取りたいと思います。

やり方は簡単で、

  1. 画像を読み込む
  2. オープニング処理をする
  3. ガウシアンフィルタをかける
  4. RGBチャンネルごとにCannyでエッジを取る
  5. チャンネルの論理和を取る
  6. 白黒反転(完成!)

やり方は簡単ですが、これを見つけるまでに結構苦労しました(笑)

ソースコード

#include <iostream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

#pragma comment(lib, "opencv_world300d.lib")

int main(int argc, char *argy[]){
	//画像の読み込み
	cv::Mat src_img = cv::imread("C:\\file\\pos\\t_kinoko\\画像ファイル名.jpg");
	
	if (src_img.empty()){
		std::cout << "cannot open file" << std::endl;
		return -1;
	}

	for (int i = 0; i < 2; i++){
		//オープニング
		cv::erode(src_img, src_img, cv::Mat(), cv::Point(-1, -1), 2);
		cv::dilate(src_img, src_img, cv::Mat(), cv::Point(-1, -1), 2);
                //ガウシアンフィルタ
		cv::GaussianBlur(src_img, src_img, cv::Size(9, 7), 10, 10);
	}
	cv::namedWindow("image", CV_WINDOW_AUTOSIZE | CV_WINDOW_FREERATIO);
	cv::imshow("image", src_img);
	cv::waitKey(0);

	cv::Mat channels[3];
        //RGBチャンネルを分割
	cv::split(src_img, channels);
	for (int i = 0; i < 3; i++){
                //Canny処理
		cv::Canny(channels[i], channels[i], 60, 180, 3);
	}
	cv::Mat canny_img;
        //論理和を取る
	cv::bitwise_or(channels[0], channels[1], canny_img);
	cv::bitwise_or(channels[2], canny_img, canny_img);
        //白黒反転
	canny_img = ~canny_img;

	cv::imshow("image", canny_img);
	cv::waitKey(0);

	cv::imwrite("C:\\file\\result\\kinoko1\\保存名.jpg", canny_img);
	return 0;
}

これだけできのこのエッジが取れます。しかし、背景やキノコの種類によってはうまく検出できないことがあります。

なので、ヒストグラムなどを使って収縮・膨張の回数やCannyの閾値の調節ができるような関数を考えないとダメっぽいです。

出来たらブログに書きます。