C++_ std::array が使えない

「不完全な型は使用できません」 とコンパイルエラー

 

ファイル冒頭に以下を追加する。

# include <array>

 

これで
std::array<int, 5> hoga = { 0,1,2,3,4 }; のコンパイルエラー解消。

 

コンパイルエラー
構文が間違っている。文法レベルのエラー。

実行エラー
構文は問題ないが、実行段階で処理が継続できないエラー。

 

http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200_020.html

 以上。

光学機器_フィルムと撮像素子

続き。

を画像として記録するのがカメラ。
フィルムカメラではフィルム
デジタルカメラでは撮像素子が担っている

 

フィルム

光を化学変化によって定着させる。

薄くて黒い光沢のあるフィルムだが、
断面を拡大すると感光層が何層にも塗られている
そして、その各層がそれぞれといった
光の色に反応 ( 感光 ) するようになっている。

 

フィルム ( ハロゲン化銀 ) の層  ハロゲン化銀 = 乳剤層

保護膜 乳剤層を守る
( 第 1 層 ) 青感性乳剤層 青色に反応し、黄色に発光する。
( 第 2 層 ) イエローフィルター 余分な青色を吸収する。
( 第 3 層 ) 緑感性乳剤層 緑色に反応し、マゼンタ(赤)に発光する。
( 第 4 層 ) 赤感性乳剤層 赤色に反応し、シアン(青)に発光する。
フィルムベース 土台

第 1 ~ 4 層の各層はゼラチンと配合され、
フィルムベースという土台の上に幾層にも正確に塗布されている。

 

 

撮像素子

レンズを通って入ってきた光を受け止める。

撮像素子は CCD CMOS がある。
以下は、CCD について。

CCD は切手以下の小さなもの。
CCD の中心部には、光を感じる受光素子 ( フォトダイオード ) の
集合体があり、碁盤のように受光素子が並んでいる
この受光素子が光を電気信号に変える
光が当たると電気を発生させその明暗を電気信号に変換する。

 

CCD は色をどのように定着させているか

フィルムには、青・緑・赤といった光の色に
反応するハロゲン化銀の層があった。このハロゲン化銀という物質が、
特定の色に反応することで画像の色を定着させていた。

 

CCD は、カラーフィルター色を識別

受光素子には色をとらえる能力はない。
そこで、受光素子にカラーフィルターがのせられ
光の 3 原色を識別する仕組みになっている。

い光だけを通すフィルター、
の光だけを通すフィルター、
い光だけを通すフィルター、
が一つ一つの受光素子かぶさっている。

 

こうして受光素子の集合体である CCD は、
全体として光の 3 原色を感知し、映像の色を再現することが
できるようになっている。

色の識別を受けた光の映像は、受光素子によって電気信号に置き換えられ、
デジタル回路に送り込まれる。
デジタル回路:電気信号としての映像をデジタル画像データに変換する。かなり複雑。

 

画像はどこに保存されるのか

電気信号から変換された画像データ ( 数字の羅列 ) はどこに?

記憶 メディア ( メモリ カード ) という記憶装置に保存される。
     記憶 メディアが、フィルムカメラフィルム同じ役割を果たしている。
      メディア:媒介

フィルムは不可逆的
記憶 メディアは可逆的。記録・消去繰り返しできる。

記憶 メディアの種類

 

 

書籍から
林檎の秘密 DIGITAL

 

以上。 

OpenCV_ Mat の基本操作

Mat 続き。

画像情報の取得

画像の行、列を取り扱うことが出来る。

rows:画像の高さ ( 行数に対応 )
cols:画像の ( 列数に対応 )

ex ) cv::Mat hoga( cv::Size(200, 100),  CV_8UC3,  cv::Scalar(0, 0, 255) );
hoga.clos で 200。

 

channels チャンネル数を取得できる。

hoga.channels( ) なら 3。

 

depth で画像のビット深度を取得出来る。

hoge.depth( ) なら 0  ( 多分。違うかも )

 

画素値の取得と設定

.at<cv::vec3b>(y, x)  を用いる。
vec3b:uchar型3要素のベクター

ex )
hoga.at<cv::vec3b>(2, 5);
で 5 列目の 2 行目 画素にアクセスできる。

 

取得する場合は
cv::vec3b p = hoga.at<cv::vec3b>(2, 5);

 

画素の変更
hoga.at<cv::vec3b>(y, x)[0] = xx; //青
hoga.at<cv::vec3b>(y, x)[1] = xx; //緑
hoga.at<cv::vec3b>(y, x)[2] = xx; //赤

 

位置が( y, x ) にある画素値を
10
20
30
各チャネルで設定したい時は、以下の様に行う。

cv::vec3b p = cv::vec3b(30, 20, 10);
hoga.at<cv::vec3b>(y, x) = p;
または
hoga.at<cv::vec3b>(y, x) = cv::vec3b(30, 20, 10);

 

画像ファイルの読込み

画像ファイルを Mat 型に変換
戻り値 cv::Mat imread ( "画像ファイルパス", 読出し方を指定する定数 )
ex)
cv::Mat hoga = cv::imread("./hoga.jpg", XXXXX);

 

第二引数

CV_LOAD_IMAGE_UNCHANGED
濃淡画像( モノクロ ) を濃淡とし、
カラー画像をカラー画像として読み込みたい時。

CV_LOAD_IMAGE_GRAYSCALE
どんな場合でも濃淡画像として読み込みたい時。

CV_LOAD_IMAGE_COLOR
どんな場合でもカラー画像として読み込みたい時。

画像読出しの失敗判定は画像データが 0 か否かで判断できる。

if( hoga.data == 0 )
{
    std::count << "NG" << std::endl;
}

 

Mat データを 画像ファイルとして保存

cv::imwrite( "画像ファイル名", cv::Mat 型データ );
ex)
cv::imwrite( "./img.jpg", hoga );

 

 

こちらから。
http://www.buildinsider.net/small/opencv/005
http://www.wakayama-u.ac.jp/~chen/cmake/LearningOpenCV.html
http://www.wakayama-u.ac.jp/~chen/opencv/opencv2.html
http://gori-naru.blogspot.jp/2012/11/blog-post_789.html

 

以上。

OpenCV_Mat の基本

Matrix ( 行列 )  の略。
画像データを格納するデータ構造。
データ構造:
データの集まりを扱いやすいように、一定の形式で格納したもの。

 

画像生成

cv::Mat hoga( cv::Size(200, 100),  CV_8UC3cv::Scalar(0, 0, 255) );

これでインスタンスが生成。
画像の幅 200 px高さ 100 px赤色の画像データ生成される。

CV_8UC3
ビット深度が 符号なしの 8bit 整数チャンネル数 3
カラー画像は 1 画素に R、G、B が入っているので、
C3 ( 3 チャンネルのデータ ) と表せる。

cv::Scalar
画像の色。(B=0, G=0, R=255 )

 

ビット深度・チャンネル数

CV_8UC3 、CV_16など。
画素の型の種類を示している。

CV_ビット数U
CV_ビット数S
CV_ビット数F
U符号なし ( unsigned )
S符号つき ( signed )
F浮動小数 ( float )

ビット数の後に「 C <チャンネル数> がついたりつかなかったり

 

CV_8U     :unsigned char
CV_8S     :signed char
CV_16U  :unsigned short
CV_32S   :int
CV_32F   :float
CV_64F   :double
CV_8UC1  :unsigned char[1] ( モノクロ画像の画素値 )
CV_8UC3  :unsigned char[3] ( カラー画像の画素値 )
CV_16UC1:unsigned short[1]
CV_16UC3:unsigned short[3]
CV_32SC3:int[3]
CV_32FC3:float[3]
CV_64FC3:double[3]

などある。

 

こちらから。
http://www.buildinsider.net/small/opencv/005
http://www.wakayama-u.ac.jp/~chen/cmake/LearningOpenCV.html
http://www.wakayama-u.ac.jp/~chen/opencv/opencv2.html
http://gori-naru.blogspot.jp/2012/11/blog-post_789.html

 

以上。

OpenCV_ インストール

よく分からないけど動いた!環境変数パスは設定していない )

 

  1. https://sourceforge.net/projects/opencvlibrary/files/
    から OpenCV をダウンロード。( opencv-win をダウンロードした )
  2. ダウンロードした .exe を展開
  3. C++ のプロジェクト内へ
    include ( x64/vc14 に格納してある ) libコピペ
  4. C# のプロジェクト内にある bin/x64/Debug
    ( x64/vc14/bin に格納しある )
    opencv_world330.dll
    opencv_world330d.dll
    コピペ
  5. ソリューションエクスプローラから
    C++ の [ プロジェクト ] を右クリック
  6. 左メニューから「 C/C++ 」を選択し、
    [ 追加のインクルードディレクト ] に
    ./include/
    を追加。
  7. C# プロジェクトのソリューションエクスプローラから
    [ 全てのファイルを表示 ] をクリック。
  8. include フォルダと
    lib 内の opencv_world330d.libopencv_world330.lib
    右クリックし、
    [ プロジェクトに含める ] を選択する。
  9. 後はソースを書く。

 

C++側ソース

    #pragma once

    #if _DEBUG
    #pragma comment(lib, "opencv_world330d.lib")
    #else
    #pragma comment(lib, "opencv_world330.lib")
    #endif


    #include <opencv2/opencv.hpp>
    #include <iostream>

    using namespace System;
    namespace testManaged {

        public ref class Class1
        {
        public :
            void test( )
            {
                cv::Mat redImg(cv::Size(320, 240), CV_8UC3, cv::Scalar(0, 0, 255));
                cv::imshow("red", redImg);
            }
        };
    }

test( ) を呼ぶと、
赤いウィンドウが開く。

f:id:koshinRan:20170910231418p:plain

C#

    class1 = new testManagedCLI.Class1( );
    class1.test( );

 

キャプチャ↓ ( クリックで拡大 )

1.

f:id:koshinRan:20170910224602p:plain

3.                            4.

f:id:koshinRan:20170910232117p:plain       f:id:koshinRan:20170910232242p:plain

6.

f:id:koshinRan:20170910224621p:plain

7.

f:id:koshinRan:20170910224746p:plain

 

 


コピペしたりなんだりしているが、環境変数へパスを追加すれば
面倒くさいことはしないで済むと思う。

 

こちらから。
http://imagingsolution.net/program/opencv/opencv_how_to_use_staticlib/
http://www.arubeh.com/archives/1102
http://www.buildinsider.net/small/opencv/003
http://www.buildinsider.net/small/opencv/004
http://harapeko-kid.hungry.jp/opencv3-1-install

 

以上。

C#_ メニューにつける三点リーダー

三点リーダー ( Text に書く時は 「 ... 」 とドット 3 つ ) を
つける時とつけない時の違い。

f:id:koshinRan:20170907194018p:plain

 

「 ... 」をつける時は、
ユーザから何らかの引数を得る場合
ex )
ファイルを開く時には選択したファイル名が引数。

確認ダイアログを表示して、 OK か キャンセルを問う場合や、
メッセージダイアログを表示するだけの場合は不要

 

「 ... 」必要

f:id:koshinRan:20170907194230p:plainf:id:koshinRan:20170907194438p:plain

 

「 ... 」不要

f:id:koshinRan:20170907194942p:plainf:id:koshinRan:20170907195903p:plain

 

こちらから。
http://deguin.blogspot.jp/2010/03/blog-post_26.html
http://moririring.hatenablog.com/entry/20120205/1328437775

 

以上。

C#_Form の追加ができない

フォームを新たに追加したら、
デザインで以下のようなエラーが出た。

f:id:koshinRan:20170906013914p:plain

ファイル内にデザインできるクラスがないため、
このファイルのデザイナーを表示できませんでした。
アセンブリが参照されているか、及びすべてのプロジェクトが
ビルドされているかを確認してください。

 

追加したフォームのコードを開き、( コードは問題なく開けることが出来た )

public partial class Form2 : Form

public partial class Form2 : System.Windows.Forms.Form
と修正したらエラー解消。
コードを開くにはソリューションエクスプローラ内の
Form2.cs を右クリックし、コードの表示 を選択。

 

X64 X86 云々が関係するようだが、よく分からん。

 

こちらから。
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/b3914f86-7a4a-44e8-9abc-caa0a8dfeda1?forum=csharpgeneralja

以上。