============ 入出力とGUI ============ .. highlight:: cpp 画像を表示する ============== .. literalinclude:: code/cpp/sample_imshow.cpp 実行結果: .. image:: image/lenna.png :scale: 30% .. image:: image/lenna.png :scale: 30% ファイルから画像を読み込む =========================== サポートフォーマットでも,さまざまなバリエーションを持つものがあります. 画像読み込みは,大半が外部ライブラリ依存ですが,例えばLinux環境では,jp2(stream),ras(RLE),bmp/dib(MS Windows 3.X packed Device-Independent Bitmap)などは読み込むことができません. .. literalinclude:: code/cpp/sample_imread.cpp ファイルに画像を書き出す ========================= pbm, pgm, ppm のフォーマットは,いずれの拡張子でも pnm 方式としてまとめられ,カラー画像はカラー画像のまま保存されます. デフォルトのパラメータで書き出す --------------------------------- .. literalinclude:: code/cpp/sample_imwrite.cpp 実行結果: .. literalinclude:: output/cpp/sample_imwrite.txt パラメータを指定して書き出す ----------------------------- * jpg の場合:品質を表す ``CV_IMWRITE_JPEG_QUALITY`` .0-100 の値を取り,値が高いほど画像品質が高くなります.デフォルトは,95です. * png の場合:圧縮レベルを表す ``CV_IMWRITE_PNG_COMPRESSION`` .0-9 の値を取り,値が高いほど圧縮率が上がります.デフォルトは,3です. * ppm,pgm,pbm の場合,バイナリ(raw)フォーマット形式を表すフラグ ``CV_IMWRITE_PXM_BINARY`` .0/1の値を取り,0の場合はascii形式で保存されます.デフォルトは,1です. .. literalinclude:: code/cpp/sample_imwrite_with_parameters.cpp 入力画像: .. image:: image/lenna.png :scale: 30% 実行結果(jpg, png): .. image:: image/imwrite/lenna_q10.jpg :scale: 30% .. image:: image/imwrite/lenna_l9.png :scale: 30% .. literalinclude:: output/cpp/sample_imwrite_with_parameters.txt カメラ画像をキャプチャする ========================== .. literalinclude:: code/cpp/sample_capture.cpp ファイルに動画を書き出す ======================== FOURCCについて書く. .. literalinclude:: code/cpp/sample_video_write.cpp ファイルから動画を読み込む ========================== .. literalinclude:: code/cpp/sample_video_read.cpp 画像をメモリ上でエンコード/デコードする ======================================== 画像のエンコードで指定できる拡張子やパラメータは, ``imwrite()`` で指定できるものと同じです. .. literalinclude:: code/cpp/sample_encode_decode.cpp 入力画像: .. image:: image/lenna.png :scale: 30% 実行結果: .. literalinclude:: output/cpp/sample_encode_decode.txt YAML/XMLを読み込む・書き出す ============================= YAMLを書き出す --------------- YAMLの場合,シーケンス(名前なしリスト)やマップ(名前付きリスト)に対して,BlockとFlowという2種類のスタイルが存在します. 例えばすべての要素がスカラである場合リストなどは,よりコンパクトなFlowスタイルで保存する方が良いでしょう. (例)Block スタイルのシーケンス:: - Mark McGwire - Sammy Sosa - Ken Griffey (例)Flow スタイルのシーケンス:: [Mark McGwire, Sammy Sosa, Ken Griffey] (例)Block スタイルのマップ:: hr: 65 avg: 0.278 rbi: 147 (例)Flow スタイルのマップ:: {hr: 65, avg: 0.278, rbi: 147} OpenCVのFileStorageに書き込む際は, `[ ]` がBlockスタイルのシーケンス, `[: ]` がFlowスタイルのシーケンス, `{ }` がBlockスタイルのマップ, `{: }` がFlowスタイルのマップ,を意味します. .. literalinclude:: code/cpp/sample_write_yaml.cpp 実行結果: .. literalinclude:: output/cpp/sample_write_yaml.yml YAMLを読み込む --------------- .. literalinclude:: code/cpp/sample_read_yaml.cpp 実行結果: .. literalinclude:: output/cpp/sample_read_yaml.txt XMLを書き出す -------------- XMLはYAMLと異なり,各ノードに Block や Flow といった種別はありません. .. literalinclude:: code/cpp/sample_write_xml.cpp 実行結果: .. literalinclude:: output/cpp/sample_write_xml.xml XMLを読み込む -------------- .. literalinclude:: code/cpp/sample_read_xml.cpp 実行結果: .. literalinclude:: output/cpp/sample_read_xml.txt マウスイベントを取得する ========================= OpenCVのhighguiで作成されたウィンドウ上の通常のキーイベントは,waitKey() メソッドで取得できますが,(CTRLやSIFTなどの)修飾キーやマウスのイベントは,コールバック関数を設定して取得します. このコールバック関数を設定するには, setMouseCallback を利用します. .. literalinclude:: code/cpp/sample_mouse.cpp 実行結果: .. literalinclude:: output/cpp/sample_mouse.txt :lines: 1-10 また,Windowの作成にQtを利用している場合,右クリックがメニューに割り当てられるために,通常は該当するイベントの取得ができません. .. image:: image/qt_window_left_click.png :scale: 30% トラックバーを追加する ====================== トラックバーをウィンドウに追加し,同時にそれに対するコールバックイベントを設定することで,トラックバーの変化に応じた処理を行うことができます. 以下の例では,トラックバーで 0 - 100 [%] の画像混合比アルファを設定し,2枚の画像をブレンディングします. .. literalinclude:: code/cpp/sample_trackbar.cpp 実行結果(20%,50%,80%): .. image:: image/trackbar_20parcent.png :scale: 30% .. image:: image/trackbar_50parcent.png :scale: 30% .. image:: image/trackbar_80parcent.png :scale: 30%