【OpenCV/Python】ドキュメントの場所

OpenCVの公式ホームページは以下の場所になります。

Home

 

Pythonに関する情報は、まだ少ない気もしますが、各関数のマニュアルは下記のページから参照します。

https://docs.opencv.org/4.5.5/

 

各関数の引数や戻り値は、使用するOpenCVのバージョンによっても異なる場合があるので、参照する前にバージョンを使用するバージョンに合わせてください。

 

調べたい関数名が分かっている場合は、右上の検索ボックスに関数名を入力すると、関数候補が表示されるので、その関数をクリックします。

 

Pythonに関する情報は、ちょっと少ない気もしますが、引数の数や順番などは確認できます。

 

日本語のドキュメントが見たい場合には、最近の更新がありませんが、もともとあったOpenCV-Pythonのチュートリアルのページ(現在は閉鎖されています)を翻訳してくれたページがあるので、こちら↓が参考になります。

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_tutorials.html

こちらのページは情報が古くなっているので、本家のページと合わせて参照すると良いかと思います。

【PyTorch】既存モデルをONNXに保存しC#で推論する方法

DeepLearningのプログラムは、ほとんどがPythonで書かれる場合が多いのですが、画像入力やGUI部分をプログラムしたいとなると、やっぱりC#で組みたい!

ということで、学習まではPythonで行い、学習結果をONNXに保存し、ONNXをC#から読み込んでC#で推論を行う方針で、いろいろ調べてみたのですが、分からない部分もボロボロと...

とりあえず、出来た事のメモです。

 

作成したプログラムのイメージ

今回は.NET Coreを使って作成していますが、.NET Frameworkでも大丈夫です。

PyTorchで既存モデルをONNXファイルに保存

今回は、画像認識モデル(Object Detection)をONNXファイルに保存するサンプルです。

入力画像サイズや出力の名前を使用するモデルに合わせる必要があります。

import torch
import torchvision

# 入力画像サイズ(N, C, H, W)
x = torch.randn(1, 3, 480, 640)
# 学習済みモデル
# 参考 https://pytorch.org/vision/main/models.html#object-detection-instance-segmentation-and-person-keypoint-detection
model = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_320_fpn(pretrained=True)

# ONNXファイルに保存
# 参考 https://pytorch.org/docs/stable/onnx.html
torch.onnx.export(
    model,                                          # ニューラルネットワークモデル
    x,                                              # 入力データ
    'fasterrcnn_mobilenet_v3_large_320_fpn.onnx',   # ONNXファイル名
    opset_version=11,                               # ONNXバージョン
    input_names = ['input'],                        # 入力の名前
    output_names = ["boxes", "labels", "scores"]    # 出力の名前
    )

input_names と output_names の指定は省略可能です。

C#でONNXファイルを読み込み、推論を行う方法

C#でONNXを扱えるライブラリは、いくつかあるようなのですが、今回は、マイクロソフトのOnnxRuntimeを使いました。

フォームにはボタン(button1)とピクチャボックス(pictureBox1)のみを配置しています。

使用には、NuGetでMicrosoft.ML.OnnxRuntimeを追加する必要があります。

分かっていない部分

以下は、私が分かっていない部分なので、出来るかも?しれません。

  • OnnxRuntimeで読み込めるONNXのバージョンは10まで?らしいのですが、PythonでONNXのバージョンを10で保存できない。
    ニューラルネットワークのモデルにも依存すると思いますが、詳細は分からず...
  • ONNXファイルに保存するとき、ワーニングがいっぱい出てる。
  • 自前でモデルの学習を行うと、C#側で正しく推論できない。
  • C#でGPUを使った推論方法が分からない。
  • C#で画像をテンソル(floatの一次元配列)に変える部分は自作しましたが、下記のページを見ても、いまいちわからず。
    https://docs.microsoft.com/ja-jp/dotnet/machine-learning/tutorials/object-detection-onnx

参考

https://pytorch.org/vision/main/models.html#object-detection-instance-segmentation-and-person-keypoint-detection

https://pytorch.org/docs/stable/onnx.html

https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/tutorials/pytorch-convert-model

https://docs.microsoft.com/ja-jp/windows/ai/windows-ml/get-started-uwp

https://docs.microsoft.com/ja-jp/dotnet/machine-learning/tutorials/object-detection-onnx

 

【Windows11】最近使用したファイルをすべて削除する方法

エクスプローラーでクイックアクセスに表示される最近使用したファイルは、完全にプライベートで使うPCの場合はあってもいいのですが、共有PCだったり、エクスプローラの画面をプロジェクタに表示する場合など、表示させたくない場合もあります。

その時に、ファイル一つ一つを消すには、消したいファイルを右クリックし、クイックアクセスから削除をクリックすれば最近使用したファイルから削除することができますが、消しても消しても古いファイルが表示され、すべてを消すのは大変です。

そこで、最近使用したファイルをすべて削除するには、エクスプローラーの右上に表示されている(もっと見る)をクリックし、オプションを選択します。

表示されたウィンドウのプライバシー消去をクリックします。

これで、最近使用したファイル内のファイル一覧がすべて削除されます。(ファイルの実態は残っています。)

そもそも最近使用したファイルを表示させたくない場合は、プライバシー内の最近使ったファイルをクイックアクセスに表示するのチェックを外します。

 

ただ、私のPC(Windows11 Home 21H2)ではエクスプローラのオプションを表示するとエクスプローラが何も操作できなくなりました。

しょうがないので、新規にエクスプローラを立ち上げ、もう一度オプションの表示をすると、オプションの画面を操作することができるようになりました。

Pythonプログラムのexe化

Pythonで作ったプログラム(*.pyファイル)は、Pythonの実行環境と、使用したモジュールがインストールされた環境でないと実行できないため、他のPCでプログラムを実行するのが面倒だったりもします。

PyInstallerというのを使うと、Pythonプログラムをexeにして実行することが可能になります。

私自身は、普段からVisual Studio2019を使って開発しているので、Visual StudioからPyInstallerを使う方法を紹介します。(おそらくVisual Studio2017以降であれば同様の操作で出来ると思います。)

Python環境の作成

Visual StudioのソリューションエクスプローラーPython環境を右クリックし、環境を追加をクリックします。

表示された画面の仮想環境を選択し、名前の部分に適当な名前を付け(今回はexeにしました)、ベースインタープリターの部分で、もともと使っていたPythonの環境(バージョン)を選択し、右下の作成をクリックします。

すると、今回作成した環境(exe)が追加されます。

ただし、パッケージ(PyPI)の部分を見ると、必要なモジュールが何もインストールされていない状態になります。

今回の例では、exe化しようとしているPythonファイル(*.py)は、pillowとnumpyを使用するため、別途、作成したPython環境(exe)に必要なモジュールをインストールする必要があります。

モジュールのインストールはPyPIとインストールされたパッケージの検索の部分に必要なモジュール名を入力すると、次のコマンドを実行する:pip install Pillow が表示されるので、この部分をクリックして、モジュールをインストールします。

各自、必要なモジュールは異なりますので、この状態で、Pythonのプログラムが実行できるか?確認しておいてください。

PyInstallerのインストール

exe化するためのPyInstallerも他のモジュールと同様にインストールします。

PyPIとインストールされたパッケージの検索の部分にpyinstallerと入力し、次のコマンドを実行する:pip install pyinstaller が表示されるので、この部分をクリックして、PyInstallerをインストールします。

私の場合、最終的に、このよう↓になります。

exe化の実行

PyInstallerを使ってexe化するには、コマンドプロンプトでコマンドを入力する必要があるので、コマンドプロンプトを表示します。

プロジェクトの名前の部分を右クリックし、表示されたメニューのここでコマンドプロントを開くをクリックします。

すると、プロジェクトのフォルダがコマンドプロンプト上に表示されます。

ここに、以下のコマンドを入力します。

pyinstaller [pyファイル名]

私の場合は以下のようにしました。

このコマンドを実行すると dist というフォルダが作成されます。

distフォルダの中にさらにプロジェクト名のフォルダが作成され、さらに、この中に目的とするexeファイルが作成されています。

他のPCでexeファイルを実行するには、exeファイルと同一階層にあるファイルすべてが必要になります。

ファイルがいくつも出来てしまうのは、少々扱いが面倒なので、必要なファイルも含めてexeファイル一つにすることもonefileオプションを設定することで可能です。

pyinstaller [pyファイル名] --onefile

また、プログラム起動時に表示されるコマンドプロンプトのウィンドウ↓

を表示させたくない場合は、windowedオプションを指定します。

pyinstaller [pyファイル名] --onefile --windowed 

私の場合の例↓

onefileオプションを使うと distフォルダ内にexeファイルが一つだけ作成されるので、このexeファイルを別のPCに持っていくだけで、Pythonや各種モジュールをインストールすることなく、実行することができます。

ただし、使用するモジュールからさらにdllを参照している場合などは、dllのインストールが必要になるかも?しれません。

参考

https://pyinstaller.readthedocs.io/en/stable/usage.html

【Python/Pillow(PIL)】JPEG画像の品質を指定して保存する

JPEG画像の保存では、品質を指定することで、画像のファイルサイズが変わります。

品質を良くすると、画像はキレイになりますが、ファイルサイズが大きくなります。

逆に品質を下げると、画像にノイズが乗りますが、ファイルサイズが小さくなります。

JPEG画像の品質を下げたときに乗る代表的なノイズとして、ブロックノイズモスキートノイズというものがあります。

品質を指定してJPEGファイルを保存するときの構文は以下の通りです。

Image.save(jpegfilename, quality = 75)

となります。

品質の値(quality)は初期値が75で指定可能なのは、0(低品質)~95(高品質)です。

サンプル

from PIL import Image

# 画像を開く
img = Image.open("Mandrill.bmp")

# JPEGで品質を指定して画像を保存する
img.save("Mandrill_q10.jpg", quality = 10)
img.save("Mandrill_q50.jpg", quality = 50)
img.save("Mandrill_q75.jpg", quality = 75)
img.save("Mandrill_q95.jpg", quality = 95)

# 画像を開く
img = Image.open("ImagingSolution.bmp")

# JPEGで品質を指定して画像を保存する
img.save("ImagingSolution_q10.jpg", quality = 10)
img.save("ImagingSolution_q50.jpg", quality = 50)
img.save("ImagingSolution_q75.jpg", quality = 75)
img.save("ImagingSolution_q95.jpg", quality = 95)

入力画像

評価用に読み込む画像は非圧縮のビットマップファイル(*.bmp)にしました。

一つは一般的な画像としてマンドリルの画像と、もう一つはモノクロでエッジの強い文字の画像にしました。

Mandrill.bmp
256×256画素24bitカラー
196,662バイト(非圧縮)
ImagingSolution.bmp
256×256画素8bitグレースケール
66,614バイト(非圧縮)

ファイルサイズの比較

quality 画像 サイズ(バイト)
10 4,465
50 13,189
75 19,908
95 47,073
10 3,594
50 6,629
75 8,487
95 15,452

等倍の画像で見ると qualityが50以上であれば、見た目に差はさほど感じられないでしょうか?

qualityが75と95とで比較すると、特に文字の画像を見ると、ほんの少しだけエッジがくっきり見えますが、ファイルサイズが倍近く異なります。

ノイズの比較

画像の中心付近を拡大して、ノイズを確認してみます。

quality = 10

quality = 50

quality = 75

quality = 95

quality = 10

quality = 50

quality = 75

quality = 95

マンドリルの画像ではquality = 50ぐらいまでが、四角いマス状のノイズ(ブロックノイズ)が確認できます。

文字の画像は、明暗の差が大きく、エッジが強い画像の代表例として用いたのですが、黒い周りにゴミのように見えるモスキートノイズが確認できます。

 

ノイズの出方やファイルサイズの両方を考えると、qualityの初期値である 75 ぐらいがバランスが良さそうです。

参考

https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.save

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html

【Python/Pillow(PIL)】画像の上下左右反転、90°ごとの回転

Pillowで画像(画像データ)を画像の上下左右反転、90°ごとの回転をさせるには、Imageクラスのtransposeメソッドを用います。

これとは別にImageOpsモジュールmirror関数(左右反転)flip関数(上下反転)があるので、これは後半で説明します。

構文

Image.transpose(method)

パラメータ

引数名 説明
method 上下左右反転、90°ごとの回転の種類を以下の中から指定します。
Image.FLIP_LEFT_RIGHT
Image.FLIP_FLIP_TOP_BOTTOM
Image.FLIP_ROTATE_90
Image.FLIP_ROTATE_180
Image.FLIP_ROTATE_270
Image.FLIP_TRANSPOSE
Image.FLIP_TRANSVERSE
戻り値 上下左右反転、回転した画像(PIL.Image)

サンプル

from PIL import Image

# 画像を開く
img = Image.open("image.jpg")

# 左右上下反転、90度ごとの回転
img_transpose = img.transpose(Image.FLIP_LEFT_RIGHT)

# 画像の保存
img_transpose.save("image_transpose_FLIP_LEFT_RIGHT.jpg")

(実行結果)

元画像 左右反転(Image.FLIP_LEFT_RIGHT)

上下左右、回転の種類

methodに指定する種類は以下の通りです。

Image.FLIP_LEFT_RIGHT Image.FLIP_TOP_BOTTOM
Image.ROTATE_180 Image.ROTATE_90
Image.ROTATE_270 元画像
Image.TRANSPOSE Image.TRANSVERSE

ImageOpsモジュールのmirror(左右反転)とflip(上下反転)

ImageOpsモジュールにも、左右反転(mirror)と上下反転(flip)の関数があります。

こちらの方が関数名的には覚えやすいでしょうか?

 

(サンプル)

from PIL import Image
from PIL import ImageOps

# 画像を開く
img = Image.open("image.jpg")

# 左右反転
img_mirror = ImageOps.mirror(img)
# 画像の保存
img_mirror.save("image_mirror.jpg")

# 上下反転
img_flip = ImageOps.flip(img)
# 画像の保存
img_flip.save("image_flip.jpg")

(実行結果)

ImageOps.mirror() ImageOps.flip()

参考

https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.transpose

https://pillow.readthedocs.io/en/stable/reference/ImageOps.html#PIL.ImageOps.flip

【Python/Pillow(PIL)】画像の回転

【Python/Pillow(PIL)】画像の回転

Pillowで画像(画像データ)を拡大/縮小するには、Imageクラスのrotateメソッドを用います。

構文

Image.rotate(angle, resample=0, expand=0, center=None, translate=None, fillcolor=None)

パラメータ

引数名 説明
angle 回転角度を度数(°)で指定します。
resample 回転時の補間方法を指定します。
Image.NEAREST
Image.BILINEAR
Image.BICUBIC
(参考)画像のリサイズ、補間指定
expand Trueのとき、画像が回転しても画像全体が表示されるよう画像サイズを拡張します。
False(初期値)のとき、画像が回転するしたときにはみ出した部分が切り取られます。
ただし、画像回転の中心は画像の中心で、平行移動が無い事を想定しています。
center 回転の中心座標を(x, y)のタプルで指定します。
初期値:画像の中心
translate 回転後の移動量を(Tx, Ty)のタプルで指定します。
fillcolor 画像の外側の色を指定します。
初期値:黒
戻り値 回転した画像(PIL.Image)

サンプル

from PIL import Image

# 画像を開く
img = Image.open("image.bmp")

# 画像を回転する
img_rotate = img.rotate(30)

# 回転した画像の保存
img_rotate.save("image_rotate.bmp")

(実行結果)

元画像 回転画像

画像がはみ出さないようにする

expand = True に設定することで、画像がはみ出さないよう、画像サイズを自動で拡張し調整します。

(例)

img_rotate = img.rotate(30, expand = True)

(結果)

画像の外側の色の指定

画像の外側の色をfillcolorに指定します。

(例)

img_rotate = img.rotate(30, fillcolor = "Blue")

(結果)

参考

https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.rotate

https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-filters

 

【Python/Pillow(PIL)】画像のリサイズ、補間指定

Pillowで画像(画像データ)を拡大/縮小するには、Imageクラスのresizeメソッドを用います。

構文

Image.resize(size, resample=None, box=None, reducing_gap=None)

パラメータ

引数名 説明
size リサイズ後の大きさを (幅, 高さ)のタプルで指定します。
resample リサイズ時の補間方法を指定します。
Image.NEAREST
Image.BOX
Image.BILINEAR
Image.HAMMING
Image.BICUBIC
Image.LANCZOS
画像の mode が 1, P や I;16などのビット指定モードのときは、Image.NEAREST が初期値
その他の場合、Image.BICUBICが初期値
box 画像を拡大/縮小する領域を(左, 上, 右, 下)の座標のタプルで指定します。
初期値は(0, 0, 画像の幅, 画像の高さ)の画像全体
cropメソッドの処理と同じ
reducing_gap リサイズ時の最適化(詳細わからず。。)
初期値: None (最適化なし)
戻り値 リサイズされた画像(PIL.Image)

サンプル

from PIL import Image

# 画像を開く
img = Image.open("Parrots.bmp")

# 画像を拡大/縮小する
img_resize = img.resize((64, 64))

# 切り抜いた画像の保存
img_resize.save("Parrots_resize.bmp")

(実行結果)

元画像 縮小画像

resample(補間方法)について

resampleの設定は、主に画像を拡大するときに画像の画素と画素の間の輝度値を求める事になるのですが、この時の求め方の方法を指定します。

この画素間の輝度値を求める方法は一般に補間と言いますが、補間については、下記のページを参照ください。

画素の補間(Nearest neighbor,Bilinear,Bicubic)の計算方法

Pillowでは、補間方法にImage.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING,  Image.BICUBIC, Image.LANCZOSの方法を指定する事ができますが、

NEAREST→BOX→BILINEAR→HAMMING→BICUBIC→LANCZOS

の順で、キレイにリサイズすることができますが、処理時間は逆に遅くなるため、用途に応じてresampleの設定を行ってください。

個人的には、画像処理後の1画素1画素の輝度値を見せたいときはNEAREST、とりあえずのBILINEARという使い分けが多いです。

下図のように部分的に画像を拡大したときに、resampleの設定を変えると、どのようになるか?見てみたいと思います。

 

NEAREST BOX BILINEAR
HAMMING BICUBIC LANCZOS

拡大の時のキレイさは、NEAREST, BOX → HAMMING → BILEAR → BICUBIC → LANCZOS の順ですかね?

参考

https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.resize

https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-filters

【Python/Pillow(PIL)】画像の一部を切り抜く

Pillowで画像の一部を切り抜くには、Imageクラスのcropメソッドを用います。

書式は

Image.crop(box=None)
引数 説明
box 切り抜く領域を(左, 上, 右, 下)の座標のタプルで指定します。

 

(サンプルプログラム)

from PIL import Image

# 画像を開く
img = Image.open("Parrots.bmp")

# 画像を切り抜く
img_roi = img.crop((146, 81, 253, 183)) # (left, upper, right, lower)

# 切り抜いた画像の保存
img_roi.save("Parrots_roi.bmp")

(実行結果)

元画像 切り抜き画像

(補足)指定座標について

画像を切り抜く座標の定義ですが、画像の幅がWidth、画像の高さがHeightとすると、
画像の左上が(0, 0)、画像の右下が(Width-1, Height-1)となります。

実際に切り抜かれる画像の領域は、左上の座標(left, upper) を含み、右下の座標(right, lower) の1画素内側の領域が切り抜かれます。

参考

https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.crop

【OpenCV/Python】imreadで画像ファイルが読み込めないときの対応

opencv-pythonのimreadで画像を開き、以下のようなフィルタ処理を行うプログラムを実行すると、エラーが表示される場合があります。

import cv2

# OpenCVで画像ファイルを開く
img = cv2.imread("Mandrill.bmp", cv2.IMREAD_UNCHANGED)

# ガウシアンフィルタ
dst = cv2.GaussianBlur(img, (3, 3), 0)

cv2.imshow("Image", dst)
cv2.waitKey(0)

エラー内容

OpenCV(4.5.5) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\smooth.dispatch.cpp:617: error: (-215:Assertion failed) !_src.empty() in function ‘cv::GaussianBlur’

 

OpenCVの場合、エラー内容の最後の方を見ると、だいたいエラーの原因がわかる場合が多いのですが、今回のエラーの内容の場合

  !_src.empty() in function ‘cv::GaussianBlur’

の部分が大事です。

直訳的に言うと、

  ’cv::GaussianBlur’関数の入力画像(src)は空(empty)ではいけません。

と言われています。

入力画像が空になる原因は imread()関数で画像ファイルが読み込めない場合がほとんどなのですが、読み込めない原因は、主に以下の2つです。

 

●画像ファイルがみつからない。(カレントディレクトリに画像ファイルが無い)

●ファイル名、ディレクトリ名に日本語が含まれている

 

画像ファイルがみつからない場合

imread()関数で、ファイル名の部分に相対パスでファイル名を指定すると、カレントディレクトリにあるファイルを探しに行くため、画像ファイルがカレントディレクトリに無いと、画像ファイルを開く事ができません。

【対策】

①ファイル名を相対パスではなく、絶対パス(フルパス)で指定する。

(例)

img = cv2.imread(r"C:\temp\Mandrill.bmp", cv2.IMREAD_UNCHANGED)

 

②カレントディレクトリを確認し、カレントディレクトリにファイルを置く。

カレントディレクトリは以下のようにすると、確認ができます。

import os

# カレントディレクトリの表示
print(os.getcwd())

ファイル名、ディレクトリ名に日本語が含まれている場合

OpenCVでは日本語を扱う事ができません。

そのため、画像ファイル名においても日本語が含まれるとimread関数で画像ファイルの読み込みに失敗します。

日本語ファイル名の画像を開くには、OpenCVではなく、PillowやNumPyを使って画像ファイルを開き、OpenCVの画像形式である ndarray へ変換する事ができます。

Pillowで画像ファイルを開いた方が、さまざまな画像ファイルフォーマットに対応しているので、汎用性が高いと思います。

(参考)

【OpenCV/Python】日本語の画像ファイル読込・保存

Snap、Grabとは?リングバッファとは?

工業用のカメラを用いた画像の撮影方法に SnapGrab という言葉があります。

簡単に言ってしまえば、Snap静止画撮影で、Grab動画撮影となります。

SnapとGrabの厳密な定義は、各種画像入力ボードのメーカーやカメラメーカーにより異なってくるかとは思いますが、簡単に説明したいと思います。

Snap

Snapでは画像の取込を開始してから、実際に画像の撮影(画像データのメモリの転送)を行い、画像の取込を停止します。

この一連の処理をSnapと言います。

ただし、Snapでもスマホのように連射をすることはできますが、画像取込と画像取込の間に画像の取込開始/停止の処理が入っているため最速のフレームレートを出せない事に注意してください。

Snapでのメリットは、次の画像取込を行うまで、撮影した画像データが上書きされる事がないので、プログラム的に簡単になります。

Grab

Snapでは画像の取込開始/停止を繰り返していましたが、Grabでは画像の取込を開始し、次に画像の取込を停止するまで画像の取込を繰り返し行います。

画像取込と画像取込の間に余計な処理が入らないため、動画のように連続的に画像を取り込む場合は、Grabで撮影を行います。

Grabの場合、動画の撮影中に撮影した画像データに対して画像処理などを行う事が多いのですが、この処理はSnapと比べて、より複雑です。

実際の画像取込は、カメラのセンサが露光時間分露光し、撮影された画像データがPCのメモリへ配置されるまでの処理となります。

そのため、撮影された画像データへアクセスするには、画像データがメモリへの配置が完了するのを待ってから、画像データをコピーするなり、直接画像処理をする必要があります。

さらには、ある程度の時間、Grabで撮影する場合、すべての画像データをメモリ格納しておく事は、メモリ容量的に無理な場合が多いので、一般的にはリングバッファ(循環バッファ)と呼ばれるメモリ形式で画像データを上書きしながらメモリに格納します。

リングバッファ

リングバッファとは、有限数のメモリ領域を上書きしながら、メモリへデータを格納する方法です。

画像データの場合は、例えば

1枚目の画像データを画像メモリ[0]へ格納
2枚目の画像データを画像メモリ[1]へ格納
3枚目の画像データを画像メモリ[2]へ格納
4枚目の画像データを画像メモリ[3]へ格納
5枚目の画像データを画像メモリ[0]へ格納 ← これ以降、メモリの上書きが発生している
6枚目の画像データを画像メモリ[1]へ格納
        :

のようにメモリを上書きしながら画像データを格納していきます。

このリングバッファで良い事は、画像を撮影しながら画像処理などを行った場合、1枚1枚の画像処理時間は、通常、バラついてしまうため、画像処理時間が、画像が格納されてから、次の画像が格納されるまでの時間を時々超えてしまう場合でも、リングバッファの面数(上図の例では4面)が多いと画像処理中に、次の画像データに上書きされにくくなります。

まとめ

画像の撮影方法にはSnapとGrabという撮影方法があります。

それぞれの特徴は以下の通りです。

長所 短所
Snap プログラムが簡単 高速フレームレートで撮影できない
Grab 高速フレームレートで撮影できる プログラムが複雑になる

 

【Windows11】マウスポインタ、ダブルクリックなどの設定

Windows11より前のWindowsではマウスの設定に関しては、コントロールパネルよりマウスの設定を行いましたが、Windows11でも同様の設定が出来ますが、別途、Windows11の設定から行うマウスの設定が追加されています。

 

Windows11での設定は、スタートボタンを右クリックし、設定をクリックします。

左側のBluetoothとデバイスを選択し、右側のマウスをクリックします。

すると、マウスの設定画面が開きます。

マウスの主ボタン

従来の主と副のボタンを切り替えると同じ機能ですが、通常のクリック(右クリックではなく)のボタンを設定します。通常はです。

マウスポインターの速度

マウスポインタの移動速度を設定します。

マウスホイールを回転させてスクロールする

マウスホイールを回転させたとき、複数行ずつ もしくは 1画面ずつ から選択します。

一度にスクロールする行数

マウスホイールを回転させたときにスクロールする行数を指定します。

ホバーしたときに非アクティブウィンドウをスクロールする

非アクティブウィンドウ(選択されていないウィンドウ)上で、マウスホイールを回転させたときに画面をスクロールするか?を設定します。

マウスの追加設定

従来のマウスの設定と同様に、マウスポインタの種類やダブルクリックの速度などを設定します。

上記のWindows11の設定と被る設定も多いのですが、最後に変更した設定が有効になります。

マウスポインター

マウスポインターのサイズを色を設定します。

マウスポインタのサイズが設定できますが、スクリーンキャプチャしたときのポインタの大きさは、キャプチャソフトによっては繁栄されない場合があります。

【Windows11】電源プラン(スリープ/シャットダウンの時間)の設定

Windowsでは、昔から一定時間で、モニタの電源を切ったり、スリープにしたり、シャットダウンしたりと出来ますが、Windows11においても同様の設定が出来ますが、Windows11からの設定方法と従来と同様の設定方法が混在している状況です。

Windows11での電源プランの設定では、設定出来る項目が少ないため、従来の方法も併せて設定する必要がありそうです。

Windows11からの電源オプション設定

スタートボタンを右クリックし、電源オプションをクリックします。

すると、画面とスリープ電源モードの設定ができます。

画面とスリープでは

●電源接続時に、次の時間が経過した後に画面の電源を切る

●電源接続時に、次の時間が経過した後にデバイスをスリープ状態にする

の状態にするまでの時間が設定できます。

電源モードでは、トップクラスの電力効率、バランス、最適なパフォーマンス の設定ができます。

 

従来の電源オプション設定

従来と同様の電源オプション設定はコントロールパネルから設定を行います。

コントロールパネルの表示はWindows11では少々わかりづらくなっているので、こちらを参照ください。

【Windows11】コントロールパネルの表示

コントロールパネルの表示は右上の表示方法の設定で変わってきますが、ここでは表示方法をカテゴリに設定した場合で説明します。

ハードウェアとサウンドをクリックします。

次に電源オプションをクリックします。

すると電源プランの バランス と 省電力 の切り替えができます。

さらに上の画面のプラン設定の変更をクリックすると、さらなる詳細の電源の設定ができます。

電源オプションをクリック後、最初に表示された画面の電源ボタンの動作を選択するをクリックすると

電源プランの作成をクリックすると

ディスプレイの電源を切る時間の指定コンピューターがスリープ状態になる時間を変更は、どちらも同じ画面ですが、以下の画面となります。

【Windows11】出力するスピーカー/ヘッドホンの切り替え

私のPCの場合、音を出力するサウンドのデバイス(スピーカー)はモニタ、USBスピーカー、有線ヘッドホン、Bluetoothヘッドホンとあるのですが、有線のヘッドホンだけは接続しても自動で出力を切り替えてくれなく、手動で出力を変更する必要がありました。

そのスピーカー/ヘッドホンの出力を切り替える方法は以下のように行います。

 

タスクバー右側のスピーカーのアイコンをクリックします。

表示されたウィンドウのボリューム調整のスライダの右側にある > マークをクリックします。

すると、接続されているスピーカー/ヘッドホンの一覧が表示されるので、出力したいデバイスをこの中から選んでクリックすると、音の出力先が変更されます。

他にもタスクバーのスピーカーのアイコンを右クリックしサウンドの設定をクリックすると、より詳細な設定が可能です。

この画面では、出力するスピーカーの切り替えの他にも、入力(マイク)の設定や、スピーカーの左右のバランス変更などが行えます。

左右のバランスを変更するには、スピーカーやヘッドホンの表示の右側に表示されている> の部分をクリックします。

この時表示されたウィンドウの左チャンネル右チャンネルの部分のスライダを調整することで、ステレオの左右バランスを調整します。

【Windows11】OneDriveのフォルダ移動

最近のPCはCドライブがSSDで主にプログラムインストール用。DドライブはHDDでファイル保存用と別れている場合が多いと思いますが、OneDriveはCドライブに作成されているので、これをDドライブへ移動させたい!

という事で、OneDriveフォルダの移動方法です。

基本的に以下の手順で行います。

OneDriveのリンク解除

フォルダの移動

OneDriveフォルダの指定

OneDriveのリンク解除

タスクバー右側の雲マークを右クリックします。

表示されたメニューの設定をクリックします。

表示されたウィンドウのアカウントタブのこのPCのリンク解除をクリックします。

表示されたウィンドウのアカウントのリンク解除をクリックします。

リンクが解除されるまで時間がかかるので、しばらく待ちます。

実際にリンクが解除されると、下のように表示されますが、一旦、ウィンドウを閉じずに放置して、次のOneDriveのフォルダを移動します。

OneDriveフォルダの移動

OneDriveのフォルダはデフォルトで、

   C:\Users\[ユーザー名]\OneDrive

にあるので、OneDriveのフォルダごと、希望の場所へ移動します。

私の場合、以下の場所へ移動しました。

    D:\Cloud\OneDrive

OneDriveフォルダの指定

OneDriveのフォルダを移動後、先ほど放置していたウィンドウからOneDriveの設定を行います。

メールアドレスの部分に自分のMicrosoft365アカウントのメールアドレスを入力し、サインインをクリックします。

次にパスワードを入力し、サインインをクリックします。

すると、元々設定されていたOneDriveのフォルダが左下に表示されているので、場所の変更をクリックします。

次に、今回移動したフォルダの場所(OneDriveのフォルダ)を指定し、フォルダーの選択をクリックします。

OneDriveフォルダは既にこのコンピューターに存在します

と表示されますが、今回は、フォルダを移動したいので、このフォルダーを使用をクリックします。

これで、設定そのものは完了です。

あとは、画面に従って次へ進めていけはOKです。

【Windows11】回復ドライブ(リカバリーディスク)の作成

以前はパソコンを購入すると、リカバリーディスクが添付されていましたが、最近では、添付されていない事も多いかと思います。

そこで、PCを購入したら、いざという時のために、まずは回復ドライブの作成をお勧めします。

以下はWindows11の時の回復ドライブの作成方法を紹介します。
回復ドライブの作成には、1時間程度かかるので、時間に余裕のある時に行ってください。

USBメモリの準備

まず、回復ドライブの作成には、16GB以上のUSBメモリが必要になるので準備します。
回復ドライブ作成時にUSBメモリがフォーマットされるので、注意してください。

私は、この↓USBメモリを購入しました。

 

ちなみに、このUSBを選んだのは、余白に文字を書けたので。

回復ドライブの作成

準備したUSBメモリは、USBポートに刺しておきます。

スタートボタンをクリックし、右上のすべてのアプリをクリックします。

次にWindowsツールをクリックします。

Windowツール画面右側の下の方に回復ドライブのアイコンがあるので、これをダブルクリックします。

すると

このアプリがデバイスに変更を加えることを許可しますか?

と表示されるので、はいをクリックします。

次に、システムファイルを回復ドライブにバックアップしますのチェックが入ったまま、次へをクリックすると、お待ちくださいのウィンドウが表示されますが、1分少々待ちます

すると刺したUSBメモリが表示されるので、このドライブが正しいか?確認します。
USBメモリはフォーマットされるので、注意してください。
表示されているドライブが正しければ次へをクリックします。

USBメモリがフォーマットされるため、確認画面が表示されますが、問題なければ作成をクリックします。

ここから、回復ドライブの作成に1時間程度かかるので、ひたすら待ちます。

作成が完了すると、下のようなウィンドウが表示されるので、完了をクリックし、これで終了です。

最終的に作成されたUSBメモリのプロパティを確認すると、8.22GB使用していました。

確かに16GBのメモリがあれば十分なようですが、回復ドライブは、年に1回、作成する事が推奨とのことで、サイズも増えそうだし、32GBのメモリを買いましたが、まぁ、いっか。。