読者です 読者をやめる 読者になる 読者になる

<!--親の顔より見た光景-->

日々の発見を残していきます。

【Eclipse】Java was started but returned exit code=13

Eclipse

Eclipseがタイトルのエラー文を出して起動しなくなった。
Javaのバージョンを1.8にしたのが原因らしい(下記サイト参照)。
Eclipseが起動しない「Java was started but returned exit code=13」 - clock-up-blog

eclipse.exeがあるフォルダのeclipse.iniの先頭行を、

-vm
C:\Program Files (x86)\Java\jdk1.8.0_60\bin\javaw.exe

に変更すると起動した。

【OpenCV】グレースケール動画を作る【Java】

動画処理 opencv Java

前回、動画の入力と情報の取得が成功したのでグレースケール化をしてみる。
JavaOpenCVのリファレンスに、C++OpenCVで使われるキャプチャ関数名が無かったのでけっこー時間がかかってしまった。)
【VideoApp.java

package videoapp;
import org.opencv.core.Core;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;
import org.opencv.videoio.VideoWriter;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

public class VideoApp {
    public static void main( String[] args ) {
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
        VideoCapture source_video = new VideoCapture( "test.mp4" );     // 動画ファイル読み込み
        if ( source_video == null ) {
            System.out.println( "動画が読み込めません" );
            System.exit( 0 );
        }
        VideoWriter video_writer = new VideoWriter( "test_gray.avi", VideoWriter.fourcc( 'M', 'J', 'P', 'G' ),
                                                     source_video.get( Videoio.CAP_PROP_FPS ), new Size( 512, 384 ) );
        Mat frame_im = new Mat();
        while ( true ) {
            if ( source_video.read( frame_im ) ) {
                Imgproc.cvtColor( frame_im, frame_im, Imgproc.COLOR_RGB2GRAY );
                Imgproc.cvtColor( frame_im, frame_im, Imgproc.COLOR_GRAY2RGB );
                video_writer.write( frame_im );
            }
            else {
                break;
            }
        }
        video_writer.release();
    }
}

実行を終えてから気づいたが、画像処理なので出力された動画の音声情報は失われる。
frame_imはキャプチャした画像を格納するMat型変数。
cvtColorでグレースケールに変換してるが、変換と同時にRGB3チャンネルから1チャンネルになる。1チャンネル画像のままwriteメソッドに突っ込むとエラーを吐くので、冗長な処理だがcvtColorでRGB3チャンネルに直している。

動画処理と言っても基本は画像処理であり、↓のソースコードのwhileループ内で自分のやりたい処理を書くだけである。OpenCVでの画像処理に慣れていれば楽勝(?)だと思う。

while ( true ) {
    if ( source_video.read( frame_im ) ) {
        // ここでグレースケール化や、エッジ化、コントラスト強調、HSV変換による色変換処理など…
        video_writer.write( frame_im );
    }
    else {
        break;
    }
}

【OpenCV】動画の入力と情報の取得【Java】

Java opencv 動画処理

Java+OpenCVでの動画処理を詳しく解説しているサイトが見つけられなかったので、以下にまとめる。
今回は初歩の初歩である、動画の読み込みとその動画の情報を取得するまで。

ソースコード

package videoapp;
import org.opencv.core.Core;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;
public class VideoApp {
public static void main( String[] args ) {
System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
VideoCapture source_video = new VideoCapture( "test.mp4" ); // ファイル読み込み
double video_width = source_video.get( Videoio.CAP_PROP_FRAME_WIDTH ); // 横幅を取得
double video_height = source_video.get( Videoio.CAP_PROP_FRAME_HEIGHT ); // 縦幅を取得
double video_frame_count = source_video.get( Videoio.CAP_PROP_FRAME_COUNT ); // フレーム数を取得
double video_fps = source_video.get( Videoio.CAP_PROP_FPS ); // フレームレートを取得

System.out.println( "動画の横幅 : " + video_width );
System.out.println( "動画の縦幅 : " + video_height );
System.out.println( "動画のフレーム数 : " + video_frame_count );
System.out.println( "動画のフレームカウント : " + video_fps );
}
}

f:id:akagi13213:20170209231456p:plain

実行結果画面とファイルのプロパティを比較すると、正しく実行できている事がわかる(フレーム数は不明だが)。ちなみにgetメソッドで動画の長さは取得できなさそう。

【LaTeX】箇条書き

LaTex

箇条書きの方法はWeb検索で一発で出るが、記憶のために書き留めておく。

1.一般的な箇条書きーーーーーー

\begin{itemize}

 \item 山

 \item 川

 \item 海

\end{itemize}

f:id:akagi13213:20170207200045p:plain

 
2.番号箇条書きーーーーーー

\begin{enumerate}

 \item 過去

 \item 現在

 \item 未来

\end{enumerate}

f:id:akagi13213:20170207200214p:plain

 
3.見出し箇条書きーーーーーー

\begin{description}

 \item[麻雀]4人用のボードゲームであり…

 \item[囲碁]2人用のボードゲームであり…

\end{description}

f:id:akagi13213:20170207200235p:plain

 
4.見出し箇条書き(改行)ーーーーーー

\begin{description}

 \item[麻雀]\mbox{}\\

  4人用のボードゲームであり…

 \item[囲碁]\mbox{}\\

  2人用のボードゲームであり…

\end{description}

f:id:akagi13213:20170207200250p:plain

 

5.入れ子箇条書きーーーーーー

\begin{itemize}

 \item 全3部屋

 \begin{enumerate}

  \item 和室

  \item 洋間

  \item 台所

 \end{enumerate}

\end{itemize}

f:id:akagi13213:20170207200318p:plain

 

マインスイーパーのシステム要求定義

・AndroidOS上で動作するマインスイーパアプリ

・マス数は10 * 18(ヨコ * タテ)

・難易度はEasy, Medium, Hard

・爆弾の数は順に38, 52, 67

・タップでマスを踏む

・長押しでマスにフラグを立てる

・被弾時に音声再生

・アプリはメイン画面と設定画面とリザルト画面から構成される

・利点:広告が無い、リセットボタンを下に配置することで片手でプレイしやすい

・基本は普段使用している既存のマインスイーパアプリを元にして作る

f:id:akagi13213:20161229203941p:plain

              メイン画面

 

f:id:akagi13213:20161229204034p:plain

              設定画面

 

f:id:akagi13213:20161229204053p:plain

              リザルト画面

 

f:id:akagi13213:20161229204207j:plain

                状態遷移図

【LaTeX】アンケート用紙を作る

LaTeX

 図のようなアンケート用紙をLaTeXで作った。

f:id:akagi13213:20161207190021p:plain

 以下にアンケートを構成する要素の詳細を記す。

タイトルと名前

 今までは名前を中央寄せにしていたが、右詰めにしてみた。下記サイト様を参考にした。

とりぷる ぷぅ 技術メモ: [TeX]タイトル、著者表記を自前で用意する

\maketitleだと著者や日付が中央に寄ってしまうので自前で記述する必要があるらしい。

 

\begin{center}

  {\Large \underline{卒業研究に関するアンケート}}

\end{center}

\begin{flushright}

  {\normalsize 所属 名前}

\end{flushright}

 

文字サイズは\Largeで14.4pt、\largeで12pt、\normalsizeで10pt。

\underline{文字列}で下線を引ける。

 

チェックボックス

 下記サイト様を参考にした。

TeXで図形:四角を出したい時 - なぜにぽえむ

 

 \usepackage{amssymb}

    ・

    ・

2.麻雀の点数計算は出来ますか?

\begin{itemize}

  \item $\Box$ はい

  \item $\Box$ いいえ

\end{itemize}

 

数直線

 よくある5段階評価を数直線で表してみた。下記サイト様を参考にした。

天地有情 [LaTeX] signchart --- 数直線グラフ上にサインを置く

\usepackage{signchart}

    ・

    ・

3.入力画面はわかりやすかったですか?

\signchart[width=15, height=0.7]{1,2,3,4,5}{悪い,,           普通,,               良い }

ウォーターフォールモデルでマインスイーパーアプリを作ってみる

コーディング

経緯

 卒研も大方終わり、丁度マインスイーパーアプリを作りたいと思っていたのでその開発をすることに決めた。 今まで行き当たりばったりなコーディングでソフトウェア開発をしていたので、この機会にしっかり準備をした上での開発をしたいと思う。

具体的には最低限以下の3つをコーディング前に決めてから開発に移りたい。

1.変数命名規則

2.わかりやすいデータ構造(後から自分で読んでも理解出来る)

3.処理の流れ(フローチャート、状態遷移図等)

 これらを踏まえて、ウォーターフォールモデルで開発をしたいと思う。ウォーターフォール型を選んだ理由は開発手法の主流であること、知っていて損は無いはず、という二点から。

 

ウォーターフォールモデルとは?

 ウォーターフォールモデルとは、古くからあるソフトウェア開発の手法。

メリット:

・計画を立てやすい

 上流工程から要求機能を詳細に落とし込む手順を踏んでゆくため、事前に今後必要となる事項を想定しながら開発できる。

進捗管理がしやすい

 全体を把握した上で工程別・タスク別に管理可能なことから、プロジェクト全体や各開発要員の進捗管理を行いやすい。

・成果物ベースでの開発

 ドキュメントなどの成果物がある状態で開発を行うため、どのような開発者でも仕様書を読めば開発する事が出来る。

デメリット:

・上流工程でしか要件定義できない

 後から変更点が合っても対応出来ない。

・仕様変更時の影響

 前工程での成果物をベースに開発を進めるので、設計ミス・仕様変更があればテストのやり直しやプログラムの修正にコストがかかる。

 ※参考

 「要求定義段階で誤りを修正するコストを1とすると、コーディング段階で要求定義の誤りを修正するコストは5倍から10倍かかる。保守段階に誤りを修正するコストは200倍となる。」(Davis, Alan M. Software Requirements: Objects, Functions, and States, Englewood Cliffs, NJ:Prentice-Hall, 1993)

 

以上、メリットとデメリットは下記サイト様より引用。

開発手法の基礎、ウォーターフォールモデルの特徴とは | エンジニアへの道|リナックスアカデミー公式ブログ

 

ウォーターフォールモデルの流れ

(1) 要件定義

・システム要件定義

 ユーザーとなる人たちにヒアリングを行い、システム化する範囲や対象業務を明確にし、新システムに必要な機能を検討する。

・ソフトウェア要件定義

 業務の手順を整理して、システムで扱うデータや処理の流れ、ソフトウェアの内容を決める。インターフェース部分の仕様、セキュリティ対策やシステムの保守方法などについてもこの段階で決めておく。

(2) 基本設計

 要件定義で決定された事項を具体化する。主な設計内容として、

・ハードウェア、データベース、ソフトウェアの選定

・データベース設計、テーブル設計

・システム・サブシステムの機能概要の設計

・入出力内容の決定

等が挙げられる。

(3) 詳細設計

 基本設計で決定された事項を画面単位、プログラム単位など、より詳細に機能分割して設計する。具体的には、

・画面、帳票のレイアウト及び機能設計

・自動実行処理の設計

・メッセージ(画面に表示する内容)仕様の設計

・クラス設計などのプログラム設計

・システムで使用するコード設計

・開発規約、コーディング規約などの検討

単体テスト仕様書の設計

(4) 製造(プログラミング)

 詳細設計書を元にプログラムをコーディングしていく。

(5) 単体テスト

 作成されたプログラムに対し、単体テスト仕様書を元にテストを行う。全てのテスト項目が完了したら結合テストに移る。

(6) 結合テスト

 各プログラムを結合し、画面遷移やデータの受け渡し等、画面・プログラム・サブシステム間の連携が正しく行われているかを確認する。具体的には、実際の業務を想定したテストケースを作成し、最初のインプットから想定される正しいアウトプットが得られるかを確認する。

(7) 結合テストシステムテスト

 実際にユーザーと同じ環境か、それと同等の環境で行うテスト。

(8) 運用テスト

 実際にユーザーに使用してもらい、要求機能を満たしているか、操作感はどうかなどを確認してもらう。

(9) リリース・保守

 不具合の修正等。ウォーターフォール・モデルに限らず保守は開発の中で最も重要なフェーズ。

 

 以上の流れで開発をしていく。マインスイーパーアプリ開発における、一つ一つの工程の詳細を本ブログに書いていく予定。大半の工程がインターンシップで学んだことを流用出来るのでスムーズに進むはず。