【Windows11】Print ScreenキーでのSnipping Toolの起動を無効にする

普段、私はデスクトップ画面をキャプチャするには、Screenpressoを使用しているのですが、Windowsのアップデートにより、Print Screenキーを押した時に Snipping Toolが起動してしまうようになってしまいました。

そこで、Print Screenキーを押した時にSnipping Toolが起動しないように設定したいと思います。

 

まず、スタートボタン右クリックし、設定をクリックします。

次に左側メニューよりアクセシビリティを選択し、右側をスクロールし、やや下の方にある キーボード をクリックします。

キーボードの設定内で、少し下の方にある、PrintScreenキーを使用してSnipping Toolを開く の設定をオフにします。

これで、Print Screenキーを押しても Snipping Toolが起動しなくなります。

しかしながら、Print Screenキーを押してもScreenpressoが起動しないので、Windowsを再起動すると、Print Screenキーを押したときにScreenpressoが起動してくれます。

【OpenCV-Python】バージョンの確認方法

OpenCVで、現在、使用しているバージョンの確認方法は、Pythonのコードで

import cv2
print(cv2.__version__)

のように、versionの前後にアンダーバー(_)を2つで挟んで表示するとバージョンを確認することができます。

私の場合、上記のコードを実行すると、

4.7.0

と表示されました。

 

普段、私はVisual Studioを使ってPythonのコードを書く事が多いのですが、これだと何も気にせず、Python環境のウィンドウで、パッケージ(PyPI)を選択すると、バージョンを確認する事ができます。

【OpenCV-Python】トラックバー(スライダーバー)

OpenCVのGUIで出来る事は少ないのですが、そのうちの一つのトラックバーの表示です。

トラックバーを使うと、二値化などのしきい値の設定に使うと便利です。

 

トラックバーの使用例

二値化のしきい値にトラックバーを使用

サンプルコード

import cv2

# ウィンドウのタイトル
window_title = "Trackbar sample"

# コールバック関数(トラックバーが変更されたときに呼ばれる関数)
def on_trackbar(val):
    if img is not None:
        # 二値化
        ret, dst = cv2.threshold(img, val, 255, cv2.THRESH_BINARY)
        # 画像の表示
        cv2.imshow(window_title, dst)

# ウィンドウの作成
cv2.namedWindow(window_title, cv2.WINDOW_NORMAL)
# トラックバーの作成
cv2.createTrackbar(
    "Threshold",    # トラックバーの名前
    window_title ,  # トラックバーを表示するウィンドウのタイトル
    127,            # 初期値
    255,            # 最大値(最小値は0で固定)
    on_trackbar     # コールバック関数
    )

# 画像の読込
img = cv2.imread("Text.bmp")

# トラックバーの値を取得
track_value = cv2.getTrackbarPos("Threshold", window_title)
# 最初の1回目の処理を取得した値で実行
on_trackbar(track_value)

# キー入力待ち
cv2.waitKey()

createTrackbar()関数

ウィンドウにトラックバーを追加します。

createTrackbar(trackbarName, windowName, value, count, onChange)
引数 説明
trackbarName トラックバーの名前
この文字がトラックバーの左側に表示されます。
windowName トラックバーを追加するウィンドウの名前
value トラックバーの初期値
count トラックバーの最大値
(最小値は設定できず、常に0となります)
onChange コールバック関数
トラックバーが変更された時に呼び出す関数を指定します。

getTrackbarPos()関数

トラックバーの値を取得します。

getTrackbarPos(trackbarname, winname)
引数 説明
trackbarName トラックバーの名前
この文字がトラックバーの左側に表示されます。
windowName トラックバーを追加するウィンドウの名前
戻り値 トラックバーの値

setTrackbarPos()関数

トラックバーの値を設定します。

値を設定すると、コールバック関数も呼び出されます。

setTrackbarPos(trackbarname, winname, pos)
引数 説明
trackbarName トラックバーの名前
この文字がトラックバーの左側に表示されます。
windowName トラックバーを追加するウィンドウの名前
pos 設定するトラックバーの値

参考

https://docs.opencv.org/3.4/da/d6a/tutorial_trackbar.html

関連記事

OpenCVのGUIで出来る事は少ないので、ボタンの表示などをしたい場合は、Tkinterなど別のGUIを使う事をおススメします。

【OpenCV-Python】Tkinter GUI Sample

【Python/tkinter】Scale(トラックバー、スライダー)

【Python.NET】PythonからC#ライブラリ(dll)の使用方法

Python.NET(pythonnet)を使うと、C#というか、.NETで作られたライブラリ(dll)を、何も手を加える事なく、そのままPythonから使う事が出来るようになります。

また、その逆のC#からPythonのモジュールを使う事も可能です。

 

今回は、.NET Frameworkで作られたライブラリ(dll)をPythonから使う方法を紹介します。

 

Python.NET(pythonnet)のインストール

これはpipでインストールできるので、簡単です。

pip install pythonnet

以降、具体的な例を示します。

 

C#ライブラリのサンプル例

今回はC#で作られたライブラリの例として、以下の用な物を用意しました。
DLLファイル名はCSharpDLL.dllとしました。

通常は、既存のDLLファイルをそのまま使う事が出来るので、わざわざC#のDLLを作成する必要はありません。

namespace CSharpDLL
{
    public class Calculation
    {
        // intの足し算
        public int Add(int a, int b)
        {
            return a + b;
        }

        // floatの足し算
        public float Add(float a, float b)
        {
            return a + b;
        }

        // stringの足し算(文字列の結合)
        public string Add(string a, string b)
        {
            return a + b;
        }

        // 結果を引数(outの参照渡し)で返す場合
        public bool Add_ref(int a, int b, out int ans)
        {
            ans = a + b;
            return true;
        }

        // 結果を引数(refの参照渡し)で返す場合
        public bool Add_out(int a, int b, ref int ans)
        {
            ans += a + b;
            return true;
        }
    }
}

PythonからC#のライブラリを使用する方法

まずは、PythonからC#のDLLを使うサンプルを以下に示します。

import clr # Python.net

# dllファイルの参照追加(拡張子なしで指定)
clr.AddReference("CSharpDLL")

# 名前空間の追加
import CSharpDLL as calc

# クラスのインスタンス(newは付かない)
cal = calc.Calculation()

# intの足し算
ret = cal.Add(1, 2)
print(ret, type(ret))

# floatの足し算
ret = cal.Add(1.5, 2.1)
print(ret, type(ret))

# stringの足し算(文字列の結合)
ret = cal.Add("1", "2")
print(ret, type(ret))

# 結果を引数(refの参照渡し)で返す場合
ans_ref = 5
ret, ans = cal.Add_ref(1, 2, ans_ref)
print(ret, ans, ans_ref)

# 結果を引数(outの参照渡し)で返す場合
ans_out = 5
ret, ans = cal.Add_out(1, 2, ans_out)
print(ret, ans, ans_out)

Python.NET(pythonnet)のインポート

import clr

これで、Python.NETのインポートになっています。なぜだか clr ??

使用するC#のDLLファイルの参照設定

clr.AddReference("CSharpDLL")

AddReference関数で、使用するライブラリのファイル名を拡張子なしで指定します。

実際のDLLファイルは、実行するPythonのファイル(.py)から参照できる位置にある必要があります。

例えば、Pythonのファイルと同一フォルダや、環境変数のPATHで指定されているフォルダに使用するDLLファイルを配置してください。

C#ライブラリの名前空間のインポート

使用するライブラリのクラスの名前空間をインポートします。

import CSharpDLL as calc

クラスのインスタンス

cal = calc.Calculation()

C#に慣れていると、ただ、メソッドを呼んでいるように見えますが、上記の書き方でクラスをインスタンスしています。(new とかは付きません)

メソッドの実行例

# intの足し算
ret = cal.Add(1, 2)
print(ret, type(ret))

# floatの足し算
ret = cal.Add(1.5, 2.1)
print(ret, type(ret))

# stringの足し算(文字列の結合)
ret = cal.Add("1", "2")
print(ret, type(ret))

# 結果を引数(refの参照渡し)で返す場合
ans_ref = 5
ret, ans = cal.Add_ref(1, 2, ans_ref)
print(ret, ans, ans_ref)

# 結果を引数(outの参照渡し)で返す場合
ans_out = 5
ret, ans = cal.Add_out(1, 2, ans_out)
print(ret, ans, ans_out)

実行結果

3 <class ‘int’>
3.5999999046325684 <class ‘float’>
12 <class ‘str’>
True 3 5
True 8 5

 

今回は、C#側でAddというメソッドをいくつかのオーバーロードを用意して、Python側から呼び出しています。

Pythonからでも、ほぼ、C#と同じ感覚でメソッドを呼び出す事ができます。

少々異なるのが、C#のメソッドで引数にrefoutを点けて参照渡しにしているメソッドは、Python側の引数に値が戻ってくる事はなく、Python.NET側で勝手にタプルになって、値が戻されます。

 

まとめ

Python.NETを使うと、C#のDLLに手を加える事なく、そのまま使用する事が出来るようになります。

私の仕事では、まだまだ.NET Frameworkを使う事が多く、自社製品もC#の対応は、ほぼ、行っていますが、Pythonの対応は出来ていないというのが現状です。

しかしながら、画像を撮り込んでDeepLearningをしたいとなると、やはりPythonでカメラの撮影をしたくなるので、とりあえず、Python.NETを使うと、何もすること無くC#のライブラリがPythonから使えてしまうのは、とてもありがたいです。

参考

https://pythonnet.github.io/pythonnet/python.html