博多南ウェブサービスのblog

博多南ウェブサービスのサービス紹介

PowerShell 7.x で、QRコード* の Decode をしたい

背景

先日、QRコードを書く機会があったのですが、 ふと"QRコードのテストってどうすれば?"なんて思いました。

1つなら、スマホで読み込んで確認、で完了ですが、 これが、100を超えるとちょっと大変です。

いろいろ調べてみると、Python, OpenCVでQRコードを検出・読み取り なんて記事もあります。

OpenCV なら、OpenCV wrapper for .NET なんてのもあり、 じゃあ、PowerShell からでもできるんじゃね?

という背景です。

やりたいこと

PowerShell 7.x と OpenCvSharp とで、QRコードの Decode をしたい。

以下、目次

できたこと

できました。コードはこんな感じ。

param (
    [Parameter(Mandatory = $true)]
    [string]$QRCodePath
)

# DLLのパス(カレントディレクトリにある場合)
$openCvSharpDllPath = ".\OpenCvSharp.dll"
$code = @"
public static class Decoder
{
    public static string DecodeQRCode(string imagePath)
    {
        try
        {
            using var src = OpenCvSharp.Cv2.ImRead(imagePath);
            if (src.Empty())
            {
                return "not decoded";
            }
            var qrDecoder = new OpenCvSharp.QRCodeDetector();
            string decodedText = qrDecoder.DetectAndDecode(src, out OpenCvSharp.Point2f[] points);
            return string.IsNullOrEmpty(decodedText) ? "not decoded" : decodedText;
        }
        catch (System.Exception)
        {
            return "not decoded";
        }
    }
}
"@
Add-Type -Path $openCvSharpDllPath
Add-Type -WarningAction Ignore -IgnoreWarnings -TypeDefinition $code -Language CSharp -ReferencedAssemblies $openCvSharpDllPath

function Decode-QRCode {
    param([string]$ImagePath)
    return [Decoder]::DecodeQRCode($ImagePath)
}

$result = Decode-QRCode -ImagePath $QRCodePath
Write-Host "Decoded Text: $result"

たとえば、こんなQRコード

https://web-noren.com/norens/show/sample-noren-urlQRコード

を用意して、使い方はこう

>pwsh .\Decode-QRcode.ps1 -QRCodePath .\qrcode-web-noren.png
Decoded Text: https://web-noren.com/norens/show/sample-noren-url

やってみて

PowerShell から、C# のコードは読み込めるというのは知っていたので、 すぐにできるかな、と思っていたら、いろいろつまずきポイントがありました。

Nuget で OpenCvSharp を Install したけど、どうするんだっけ?

Release 4.11.0.20250507README に、

OpenCvSharp core libraries: OpenCvSharp.dll と Native binding: OpenCvSharpExtern.dll が必要です。

みたいな記述に読めたので、ps1 ファイルと同じ場所に置きました。

Add-Type で Warning でてますけど、、、

うーん、Warning 消したらいけるかな?

Need help resolving error CS1701 in PowerShell

よし、いける!!

(もしかしたら、OpenCvSharp Build Instructions で build しなおしたらかもだけど。。。よし!)

Chrome から QRコード作成すると、Decoded Text: not decoded なんですけど

真ん中に恐竜がでてくるこんなやつ。

真ん中に恐竜がでてくるこんなやつ

これは、この記事を書いているときにやってみて気づきました。

OpenCV 側のあれかな?

いろいろ仕組み等把握したくて、参考情報を見てみましたが、、、?

今度、時間があるときにじっくり。

Powershell 7.x だけじゃなく、Powershell 5.x (標準で Windows 11 に入っているやつ)でもいけるんじゃ?

いけませんでした。

お知らせ

本記事で利用した https://web-noren.com/norens/show/sample-noren-url は、

スマホやパソコンから、 お店が、「開いている/しまっている」や「空いている/混んでいる」を、 リアルタイムにお知らせするための、サービスです。

これがあればお客さんの、

店の前まで行って「あ、お店混んでたんだ!じゃ、やめとこ」

がなくなります!!

お客さんは、QRコードや LINE でお店から送られた URL にアクセスするだけ!

無料利用もできますので、ぜひお試しください!

Web のれん

参考にしたところ

以上でした。

*QRコードは株式会社デンソーウェーブの登録商標です。