VS CodeでOpenCVする時に、MacBook内蔵Facetimeカメラが使えない(セキュリティーとプライバシー)


とりあえず、最短距離でOpenCVを試してみたい

Mac/iMacで、OpenCVやってみたい、さぁ、とりあえずサンプルを、と思ったとき、以下のような最短手順で、内蔵Facetimeカメラを使った顔認識を試すことができます。

ダウンロード/インストール

pip3 install -U opencv-contrib-python
curl -OL https://github.com/opencv/opencv/archive/4.5.1.zip
unzip 4.5.1.zip

実行

cd opencv-4.5.1/samples/python

python3 facedetect.py
カメラへのアクセスが必要と言われたら、[OK]を押して、もう一度実行。
自分の顔で試したり、そのへんに転がっていた集合写真などをかざせば、オッケー。
(escキーで終了)

(蛇足)ダウンロードは、curlでもwgetでもお好きな方で。

wgetが好きな人は、curlの代わりに、
wget https://github.com/opencv/opencv/archive/4.5.1.zip
brewでwgetをインストールする場合は、
brew install wget

VS Codeでやってみると、あれ???

VS Code便利!、ターミナルもVS Codeで、となっている人も多いと思います。
で、やってみると、んんー、と考えた後、エラーが出ます。

Abort trap: 6

なにこのエラーメッセージ。そっけない。ググッてみたら、C++コード実行時例外発生、ということで、いろいろな局面で出る模様。

Facetime HD Camera関係でググると、カメラのアクセスがシステムによって許可されていないから、ということ。「システム環境設定/セキュリティーとプライバシー/カメラ」で、登録するやつですね。

ターミナルアプリは、許可されているのでオッケー。はい、ここにVS Codeも登録したら良いです。とはならない。。

例えば、ブラウザ経由で動いているJupyterがカメラ/マイクを使おうとするとき、Jupyterからリクエストがでて、ここに登録する流れができますが、VS Codeはそれがないことが問題。マイクへのアクセスも同様。

とりあえずの解決策

ターミナルから、code .とコマンドを打ってVS Codeを起動すればよい。カメラ/マイクへのアクセスは、起動した親のアクセス権が適応される、ということ。

codeコマンドを有効にするには、
1. VS Codeのコマンドパレットから、shellと入力。
2. 「シェル コマンド: PATH内に'code'コマンドをインストールします」をクリック。

根本的な解決

VS CodeのGitHub.comリポジトリで、issueが上がっています。

'VSCode terminal doesn't allow/request permissions to access media devices #95062'
https://github.com/microsoft/vscode/issues/95062

問題は認識されているが、未解決。
根本的な解決は、VS Codeが「セキュリティーとプライバシー」に登録される流れを実装すること。しばし待て、ですね。

危険なゴニョゴニョ

おとなしく、待つ方が賢明です。それでもやりたい人は、データベースを直接書き換えます。アップデートなどでデータベースの構造が変化していたりすると、バグります。

リカバリーモードでシステム再起動(cmd+R長押し)して、System Integrity Protection(SIP、システム整合性保護)を一時的に無効化しないとダメ、というサイトが多数見られますが、不要です。

代わりに、ターミナルにフルディスクアクセスの権限を与えます。

Mojaveは、これで行けました。

# TCC.dbを念の為バックアップして、データベースを編集
cd ~/Library/Application\ Support/com.apple.TCC/
cp TCC.db TCC.db.bak
sqlite3 TCC.db  # sqlite>プロンプトが出ます。

# Mojaveの場合:
#  VS Codeにカメラへのアクセス権を追加
INSERT into access VALUES('kTCCServiceCamera',"com.microsoft.VSCode",0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

#  マイクへのアクセス権を追加
INSERT into access VALUES('kTCCServiceMicrophone','com.microsoft.VSCode',0,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

BigSurの場合(すみません、未検証です。どなたか、冒険心と興味あれば追試を。危険です。)

# BigSurの場合:

GitHub.comのissueでBigSurを検証してくれた人がいました。カラムが12から13に増えたようで、1を一つ増やしてオッケーだったようです。

INSERT into access VALUES('kTCCServiceCamera',"com.microsoft.VSCode",0,1,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

INSERT into access VALUES('kTCCServiceMicrophone','com.microsoft.VSCode',0,1,1,1,NULL,NULL,NULL,'UNUSED',NULL,0,1541440109);

おまけ。OpenCVのサンプル実行

色々試すには、メニューアプリdemo.pyを使う。

cd opencv-4.5.1/samples/python
python3 samples/python/demo.py

読みにくかったので、フォントやフォントサイズを改変しました。各エントリーが、かなりいい加減に作られていて、ボロが出ます。もうちょっとメンテしても良さそうな。。

ビデオソースを使うデモとしてわかりやすいのは、こんなところで。

facedetect.py
mosse.py
edge.py

基本的にescキーで終了、となっているものが多いかな?

レナさんファンは、チュートリアルにある、こちらなど、どうぞ。

cd opencv-4.5.1/samples/python
python3 tutorial_code/ImgTrans/Filter2D/filter2D.py