うぃろぅ.log

140字で綴りきれない日々の徒然備忘録

【セトリ】 <物語> フェス セットリスト

2019/5/11に幕張メッセ イベントホールで開催された
<物語> フェス
セットリストです
※ 役名表記、神原駿河曲はCD音源です

1: staple stable (TVサイズ) / 戦場ヶ原ひたぎ
2: 帰り道 / 八九寺真宵
3: ambivalent world / 神原駿河
4: marshmallow justice / 阿良々木火憐
5: the last day of my adolescence / 神原駿河
6: オレンジミント / 斧乃木余接
7: terminal terminal / 八九寺真宵
8: suger sweet nightmare / 羽川翼
9: mathemagics / 老倉育
10: decent black / 忍野扇
11: もうそう♡えくすぷれす / 千石撫子
12: 白金ディスコ / 阿良々木月火
13: chocolate insomnia / 羽川翼
14: 恋愛サーキュレーション / 千石撫子
15: 夕立方程式 / 老倉育
16: dark cherry mystery / 忍野扇
17: dreamy date drive / 戦場ヶ原ひたぎ
18: wicked prince / princess à la mode

【セトリ】 小倉唯 LIVE TOUR 2019 「Step Apple」 千葉公演 セットリスト

2019/5/3、2019/5/4に幕張メッセ イベントホールにて開催された
小倉 唯 LIVE TOUR 2019
「Step Apple
千葉公演 のセットリストです。
※ 初日: ① 2日目: ②としています。

1: 白く咲く花
2: ハイタッチ☆メモリー
3: Hop Step Junp!
4: Honey♥Come!!
5: FARAWAY
6: TO BE ALIVE
7: ① Raise
Future Strike
8: Baby Sweet Berry Love
9: ① プラチナ・パスポート
② Happy Strawberry
10: 君が好きです
11〜13(メドレー): パンドラ♡ショコラ
〜 いつだってCall Me!
〜 Baby, Baby, Baby♡
14: Love Me × Love Me
15: ① ガーリッシュエイジ
② ドキドキラビリンス
16: 雨の森はウソつき
17: ショコラ
18: Sing-a-ling-a-Harmony
19: Reflect
20: Hopeful Days
21: アップル・ガール

アンコール
22: 永遠少年
23: Tinkling Smile
24: ① ピーナッツ!
② thx!!

ダブルアンコール(2日目のみ)
25: ピーナッツ!

f:id:vviilloovv:20190407174852j:plain

【セトリ】 花澤香菜 / KANA HANAZAWA Concert Tour 2019 -ココベース- 広州/上海公演 セットリスト

2019/4/12に広州体育館、
2019/4/14にメルセデスベンツアリーナにて開催された
KANA HANAZAWA Concert 2019 -ココベース-
広州/上海公演のセットリストです。
※ 変更点なし

1: マイ・ソング
2: Change!
3: パン
4: おとな人間
5: 告白氣球 / 周杰倫 (カバー)
6: happy endings
7: 君がいなくちゃだめなんだ
8: 初恋ノオト
9: 透明な女の子
10: 春に愛される人に わたしはなりたい
11: ミトン
12: 大丈夫
13: 25 Hours a Day
14: CALL ME EVERYDAY
15: 恋する惑星
16: あたらしいうた
アンコール 17: 恋愛サーキュレーション
18: sweets parade
19: 星空☆ディステネーション
20: Ready to go
21: おやすみ、また明日

f:id:vviilloovv:20190416224613p:plain

日本公演のセットリストは下記リンクへどうぞ。

vviilloovv.hatenablog.com

【セトリ】 小倉唯 LIVE TOUR 2019 「Step Apple」 滋賀公演 セットリスト

2019/4/7にびわ湖ホールにて開催された
小倉 唯 LIVE TOUR 2019
「Step Apple
滋賀公演のセットリストです。

1: 白く咲く花
2: ハイタッチ☆メモリー
3: Hop Step Junp!
4: Honey♥Come!!
5: FARAWAY
6: TO BE ALIVE
7: Raise
8: Baby Sweet Berry Love
9: Happy Strawberry
10: 君が好きです
11〜13: パンドラ♡ショコラ
〜 いつだってCall Me!
〜 Baby, Baby, Baby♡ (メドレー)
14: Love Me × Love Me
15: ドキドキラビリンス
16: 雨の森はウソつき
17: ショコラ
18: Sing-a-ling-a-Harmony
19: Reflect
20: Hopeful Days
21: アップル・ガール
アンコール
22: 永遠少年
23: ピーナッツ!

f:id:vviilloovv:20190407174852j:plain

【セトリ】 花澤香菜 / KANA HANAZAWA Concert Tour 2019 -ココベース- 国内公演 セットリスト

2019/4/6に一宮市民会館
2019/4/21にイズミティ21
2019/4/27にグランキューブ大阪
2019/4/29に新宿文化ホールで開催された
KANA HANAZAWA Concert 2019 -ココベース-
国内公演のセットリストです。
※ 東京のみ変更あり

1: マイ・ソング
2: Change!
3: パン
4: おとな人間
5: 染まるよ / チャットモンチー (カバー)
6: おしえて
7: Tact
8: 春に愛される人に わたしはなりたい
9: ミトン
10: Brand New Days
11: 大丈夫
12: 25 Hours a Day
13: CALL ME EVERYDAY
14: 恋する惑星
15: あたらしいうた

アンコール
16: 恋愛サーキュレーション
17: We Are So in Love
18: Ready to go
19: おやすみ、また明日(愛知/宮城/大阪)

19: 星空☆ディスティネーション(東京)
20: おやすみ、また明日(東京)

f:id:vviilloovv:20190406202543j:plain

広州 / 上海公演のセットリストは下記リンクへどうぞ。

vviilloovv.hatenablog.com

【C#】 OpenCvSharp おぼえがき 動画読込み / サムネイル表示 / キャプチャー保存

うぃろぅです。

営業から「画像処理の仕事あるけど話し聞いてみない?」と提案され、上司が概要を聞きに行ったはいいもののスケジュールが厳しそうなため断るまでがここ1週間の出来事。

私は「技術検証して」って要求仕様をぶん投げられ、わりかし楽しんで調べていたのに話が流れてしまったために詰め込んだ知識が宙ぶらりんに。なのでこちらに放流していきます。

今回はOpenCvC#用ライブラリ、OpenCvSharpについて残していきます。

github.com

公式リポジトリはこちら。ダウンロード方法も全部書いてあります。

OpenCvSharpを使う その1 (準備) - schima.hatenablog.com

パッケージ作成者の方のブログです。なんと日本の方。崇めましょう。

まずは準備と、簡単なところからということで動画のキャプチャーを出力します。

動作環境

Windows 7 64bit
Visual Studio Professional 2017
C# 7.0 OpenCvSharp

そもそもC#じゃなくてPythonやらC++やらを使えという気がしますが、C#で作られている似たようなものがあるからそれ流用できない?と言うお話だったので…。
でも5~6年前のものだったからバージョンが太古。頑張ろう。

ちなみにメモリは8GBのため、フォームプロジェクトを作るとインテリセンス表示で毎回ゲロ重になる。というか2回ほどブルスクになった。泣きそう。

仕様

  • 出力する画像の形式は.jpg.pngを選択できるようにする
  • 画像化する範囲はフレーム単位で指定する
  • 画像化する間隔は1フレーム0.1秒間隔で指定できるようにする

これが最低限の要求っぽい。もう流れたから単純に趣味で実現することにする。

成果物

  • 初期画面

    f:id:vviilloovv:20190326140015p:plain
    見た目がダサい?私もそう思います()

  • 動画読込み完了時

f:id:vviilloovv:20190326140329p:plain
動画を読み込むとこんな感じ

パスとかは隠しています。

[変換開始]を押下すると指定のディレクトリに6桁ゼロ埋めの連番を付与して出力します。多分まだバグは残っています。気づいたら直す予定。

準備

適当に新規プロジェクトを作成し、[プロジェクト]→[NuGetパッケージの管理]。

f:id:vviilloovv:20190326142042p:plain

opencvで検索して出てくるOpenCvSharp3-AnyCPUだけ入れればOK。記事作成時点でのバージョンは4。3とは。

ソース

動画サムネイル表示

opencv.jp

shimikel.hatenablog.com

note.nkmk.me

pynote.hatenablog.com

上記記事を参照しました。動画は画像が連続している、画像は行列で扱っているということを押さえておけば基本的にはOK。詳しくは先人がわかりやすく書いてくれているから読めば大体わかるはず。

動画のパスを指定できているとします。ドラッグドロップを許可するでもファイル選択窓を開くでも決め打ちでも引数でもお好きに。

動画を扱うにはVideoCaptureクラスを使えばいいらしいです。
リソース開放が必要なのでusing句を使うのが吉。

using OpenCvSharp;は追記しておきましょう。

以下のソースでは動画のキャプチャーと動画情報を取得しています。

public bool ReadMovieInfo(string moviePath)
{
  movie = new MovieInfo(moviePath);

  using(var vc = new VideoCapture(movie.Path))
  {
    if(!vc.IsOpened()) return false;

    movie.FrameRate = (int)vc.Get(CaptureProperty.Fps);
    movie.FrameCount = (int)vc.Get(CaptureProperty.FrameCount);
    movie.FrameHeight = (int)vc.Get(CaptureProperty.FrameHeight);
    movie.FrameWidth = (int)vc.Get(CaptureProperty.FrameWidth);
    movie.SecCount = movie.FrameCount / movie.FrameRate;

    // 再生時間1秒時点のキャプチャーを取得
    var frameNo = (movie.FrameRate <= movie.FrameCount) ? movie.FrameRate : 0;
    vc.Set(CaptureProperty.PosFrames, frameNo);
    vc.Read(movie.Thumbnail);
  }
  return true;
}
public class MovieInfo
{
  public string Path { get; }
  public int FrameRate { get; set; }
  public double SecCount { get; set; }
  public int FrameCount { get; set; }
  public int FrameHeight { get; set; }
  public int FrameWidth { get; set; }
  public Mat Thumbnail { get; set; } = new Mat();

  public MovieInfo(string path)
  {
      Path = path;
  }
}

動画情報は独自クラスのプロパティに設定しています。

VideoCapture#Set(CaptureProperty, int/double)で動画の参照する箇所を設定し、VideoCapture#Read(Mat)で引数に指定したMatに画像が設定されます。

これを単純に表示窓に出すだけならCv2#ImShow(string, Mat)でできますが、フォーム上に表示するなら一工夫が必要です。

プログラムジャンク箱: MatをFormのpictureBoxに表示

こちらの記事をパク参考にしてPictureBoxに表示させます。

using OpenCvSharp.Extensions;を追記してから以下を作成。

public void DisplayThumbnail(PictureBox pictureBox)
{
  var dispSize = new Size(pictureBox.Width, pictureBox.Height);
  var dispImg = movie.Thumbnail.Resize(dispSize);
  pictureBox.Image = BitmapConverter.ToBitmap(dispImg);
}

サムネイル表示に関してはこれでOK。

動画キャプチャー出力

あらかじめ

  • 出力フォーマット
  • キャプチャー開始フレーム
  • キャプチャー取得間隔
  • 出力キャプチャー数

を計算/設定しておくものとします。

以下ソース。

留意点をいくつか。

  • movieは上記MovieInfoクラスのインスタンスです。
  • outDirectoryPathは出力先のディレクトリパスです。適当に設定します。
  • 出力フォーマットはインデックス番号で扱っていますが悪手です。ごめん。
/// <summary>
/// 動画キャプチャー保存
/// </summary>
/// <param name="outFormat">出力形式</param>
/// <param name="start">開始フレーム</param>
/// <param name="interval">キャプチャー取得間隔</param>
/// <param name="outCount">出力数</param>
public void SaveCapture(int outFormat, int start, int interval, int outCount)
{
  // 出力形式が2種類のため三項演算子
  var fileName = Path.GetFileNameWithoutExtension(movie.Path);
  var ext = (outFormat == OUT_FORMAT_JPEG) ? ".jpg" : ".png";

  // 動画読込み
  using(var vc = new VideoCapture(movie.Path))
  {
    if (!vc.IsOpened())
    {
      CautionBox.Show("動画読込みに失敗しました");
      return;
    }
    var frameNo = start;
    var outCap = new Mat();

    // キャプチャー保存
    Enumerable.Range(1, outCount).ToList().ForEach(i =>
    {
      vc.Set(CaptureProperty.PosFrames, frameNo);
      vc.Read(outCap);
      var outName = $"{fileName}_{i:D6}{ext}";
      var outPath = Path.Combine(outDirectoryPath, outName);
      Cv2.ImWrite(outPath, outCap);
      frameNo += interval;
    });
  }
  MessageBox.Show("出力完了", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

CautionBoxクラスも自作。ボタンとアイコンが同じものを使いまわすので作っちゃった方がコピペより美しい(と思い込んでいるの)です。

public static class CautionBox
{
  public static void Show(string msg)
  {
    MessageBox.Show(msg, "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  }
}

Cv2#ImWrite(string, Mat) で指定した名前で出力します。特別なことをしなくとも.jpg.pngはファイル名にそれぞれの拡張子を付与するだけで表示できました。すごい。


今回はここまで。「リセット判定」とか「黒画判定」という単語からわかる方もいるとは思いますが画像処理と言うよりは映像処理系です。引き続きお勉強していきます。

OpenCvSharp、最近の情報が調べてもあんまり出てこないんですよね。まぁPythonとかC++とかを使えって話だと思いますが。仕事で使わないにしても画像処理を学ぶいい機会だと考えているので続けていきたい所存。状況が変わったら無理になりますが。

ではまた。

【C#】 続・CSVのヘッダーだけ読み込んで出力する

うぃろぅです。
ふと過去のエントリー見てたら「いやお前何やそのコード」ってなったので書きます。

こんな記事を書いた

vviilloovv.hatenablog.com

あなた疲れてたのよ

こんな小難しいこと全くする必要なかった。

CSVだろうが結局のところテキストなのだから単純に1行目を読み込んでSplitすればおしまいなのである。

純化した

以下コード。

using System.Text;
using System.IO;

class Program
{
  static void Main(string[] args])
  {
    var sJis = Encoding.GetEncoding("Shift-JIS");
    var csvPath = @"C:\Sample\csv";
    var csvs = Directory.GetFiles(csvPath, "*.csv", SearchOption.AllDirectories);

    // ファイル数ループ
    foreach(var csv in csvs)
    {
      // 行数がわからないので1行読込
      string row;
      using(var sr = new StreamReader(csv, sJis)) row = sr.ReadLine() ?? "";

      var outPath = Path.Combine(csvPath, "header", Path.GetFileName(csv));

      using(var sw = new StreamWriter(outPath, false, sJis))
      {
        foreach(var head in row.Split(','))
        {
          sw.WriteLine(head);
        }
      }
    }
  }
}

ネスト深め。なんとかしたいけどそんなに難しいことしていないからこれで。

前回のコードと比べると10行ほどの削減。
あとMicrosoft.VisualBasic.FileIOをインポートしていないから参照の追加が不要。

将来の自分に向けて書いた過去の自分、GJ。褒めて伸ばす。

ではまた。