ちろぐ

自分用備忘録

OpenCV+libdmtxでDataMatrixを読む

OpenCVのcv::Matデータをlibdmtxの処理に突っ込んで画像内のデータマトリックスを読む方法。

 

OpenCVにはcv::findDataMatrix()というDataMatrixを読む関数があるけど、なんか調べると3文字までしか読めないとか言われているので外部ライブラリを使用して使えるようにする。

 

・libdmtxのインストール(ubuntu16.04)

 1. ターミナルで以下のコマンドを入力

   $sudo apt-get install libdmtx-dev libdmtx-utils

 2. /usr/lib/aarch64-linux-gnuの直下にlibdmtx.soがあることを確認。

   (環境によって場所は変わるかも)

 

・Qtプロジェクトで使用する

 1. 自分はQt creator使ってるんでプロジェクトファイルにライブラリを追加

   LIBS += -L"/usr/lib/aarch64-linux-gnu" \

       -ldmtx

 2. dmtx.hをインクルード

   #include <dmtx.h>

 3. 以下のようなプログラムで使用できる。

QString decode( cv::Mat frame )
{
 DmtxImage *img;
 DmtxDecode *dec;
 DmtxRegion *reg;
 DmtxMessage *msg;
 DmtxTime time;
 QString result;

 img = dmtxImageCreate( frame.data, frame.cols, frame.rows, DmtxPack24bppRGB );
 dec = dmtxDecodeCreate( img, 1 );
 time= dmtxTimeAdd( dmtxTimeNow(), 10 );
 reg = dmtxRegionFindNext( dec, &time );

 if( reg != NULL )
 {
  msg = dmtxDecodeMatrixRegion( dec, reg, -1 );

  if( msg != NULL )
  {
   result = QString( reinterpret_cast<char*>(msg->output) );
   dmtxMessageDestroy(&msg);
  }

  dmtxRegionDestroy(&reg);
 }

 dmtxDecodeDestroy(&dec);
 dmtxImageDestroy(&img);

 return result;
}

 

 

 

 

raspberryPiにsambaを導入

前回の記事でraspberryPi2の外付けHDDにあるメディアをDLNAで視聴できるようにした。

しかし、現状では新しく外付けHDDにファイルを追加したい時、母艦のPCからファイルを渡すのが面倒である。

 

そこで、raspberryPi2にsambaを導入して外付けHDDのフォルダを母艦と共有できるようにしてファイルの更新を簡単にする。

 

参考にしたのは次のサイト

tool-lab.com

 

sambaをインストールして色々設定して母艦から参照できるようにする。

と、ここでDLNAで参照しているフォルダもsambaで共有できるように/etc/samba/smb.confの最後尾に以下を追加する。

[RaspNAS]

comment=USBHDD

path=/var/share/hdd

public = Yes

writable = Yes

guest ok = Yes

force user = pi

 

これで外部から/var/share/hddを参照できるようになり、ファイルを突っ込めばそのままDLNAでメディアを視聴できるようになる。

 

 

 

RaspberryPi2でDLNAを使う。

RasberryPi2にDLNAサーバーを作成する。

 

参考にしたのは以下のサイト

www.lanhome.co.jp

 

---------- DLNAサーバの設定

1.DLNAサーバーソフトの「minidlna」をインストールする。 
  $ sudo apt-get install minidlna

2.動画、画像、音楽を保存するためのDLNA対応のディレクトリーを作成する。 
  $ cd /var/lib/minidlna (minidlnaディレクトリーに移動する)
  $ sudo mkdir movies (moviesディレクトリーを作成する)
  $ sudo mkdir photos (同上)
  $ sudo mkdir musics (同上)

3.各ディレクトリーがDLNAに対応するように設定ファイルを編集する。 
  $ sudo nano /etc/minidlna.conf (minidlna.confを編集する)
minidlna.confファイルの中に、次の行を追記する。 
  medir_dir = /var/lib/minidlna (minidlna.conf内にこの行を追記する)

4.各ディレクトリーにアクセスできるように所有者をユーザーのpiに変える。
  $ sudo chown pi:pi movies photos musics
5.minidlnaを再起動
  $ sudo service minidlna restart

 

 ここまでの設定で、/var/lib/minidlnaにあるファイルを視聴することが可能になる。

 しかし、rasberrypiのmicrosdの容量は少ないためたくさんのファイルを置くことはできない。そこで、外付けHDDを接続し、HDDに置いたファイルをDLNAで視聴できるようにする。

---------- 外付けHDDの設定

1.USB-HDDを初期化するために情報を表示する。
  $ dmesg (USB-HDDのデバイスファイル名等が分かる。通常は、sda)

2.HDDのパーティションを再設定する。
  $ sudo umount /dev/sda1
  $ sudo fdisk /dev/sda (パーティションsdaの設定を開始)

3.設定を開始する。
  pを入力 (パーティションが一覧表示される)
  dを入力 (パーティションを削除)
  nを入力 (新しいパーティションを作成)
  pを入力、1を入力 (Partition typeを決める)
  Enterキーを2回押す (パーティションの先頭とサイズを決める)
  tを入力、83を入力 (パーティションタイプを指定)
  wを入力 (パーティションを書き換える)

4.上記のパーティションファイルシステムを構築するために、下記を実行する。
  $ sudo mkfs.ext4 /dev/sda1

次に、このストレージを特定のフォルダ(ディレクトリー)にマウントする操作を行う。
ここでは、/var/shareの中に新しいディレクトリーhddを作っておいて、/var/share/hdd にマウントすることにします。
  $ cd /var/share
  $ sudo mkdir hdd 
そのために、まずUSB-HDDの識別値UUIDを調べてコピーしておきます。
  $ sudo blkid /dev/sda1 (識別値UUIDが表示される)

続いて、マウントの設定fstabを編集するためにエディタで開いて、その末尾にUUIDを追記する。
  $ sudo vi /etc/fstab
追記内容は、「UUID=調べたUUID /var/share/hdd ext4 defaults 0 0」

最後に、上記の設定をマウントする。
  $sudo mount -a

 

 以上の設定で/var/share/hddにファイルを置くと、外付けHDDにファイルを置かれるようになる。

 ビデオ、写真、音楽のフォルダを分ける。

  $cd /var/share/hdd

  $mkdir Videos

  $mkdir Audios

  $mkdir Pictures

 

 最後に/etc/minidlna.confを以下のように修正してDLNAサーバの参照先を外付けHDDにする。
  $sudo vi /etc/minidlna.conf

  medir_dir = V,/var/share/hdd/Videos
  medir_dir = P,/var/share/hdd/Pictures
  medir_dir = A,/var/share/hdd/Audios

 

 /etc/minidlna.confに設定値はとりあえず下のようにして置く

  medir_dir = V,/var/share/hdd/Videos
  medir_dir = P,/var/share/hdd/Pictures
  medir_dir = A,/var/share/hdd/Audios

  port=8200        // ポート番号
  inotyfy=yes      // yesにしないとforce-reloadした時に反映されない。
  notify_interval=1200   // 設定秒毎に情報を更新

 

 これで外付けHDDに保存されているファイルを読みに行く。

 

 追記

 サブフォルダを作成した際に、そのサブフォルダ名が全て大文字だとなぜかファイルが存在してもリストに出てこない。原因はわからないけど、サブフォルダ名を小文字にしたら解決した。

 

 

 

Nexus7でAndroid File Transferが使えなくなって困った。

正しくは、MacとNexus7を繋いだ際に、いつもはAndroid File Transferが起動してファイルのやり取りができるんだけど、Nexus7をAndroid 6.0 Mashmallowにしてから(?)できなくなった。

 

具体的には、「Can't access device storage」と表示される。

 

設定の開発者向けオプションからUSB設定の変更をMTPに変えても治らなかった。

 

んで、この現象を治すのに下のサイトが参考になりました。

 

色々方法はあったけど、僕にとっては

①開発者オプションの「USBデバッグ」の項目をONにする。

②Nexus7の電源をOFFにする。

③USBケーブルを繋げる

④電源をONにする。

Android File Transferを起動する。

の手順で現象が治りました。

 

でも、昔USBデバッグの項目をONにした気がするんだけどなぁ?別のデバイスと勘違いしてたか?

 

 

 

BlueToothキーボードから操作できるようにする

RaspberryPi2で使用できるUSBの数は4つ。

現状USBWi-Fi,USBキーボード,USBマウスの3つが占領しているので、BlueToothドングルを使用してキーボードとマウスをワイヤレスにしてしまおう。

 

今回参考にしたのは次のサイト

nwpct1.hatenablog.com

 

とりあえずリストを更新
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade

 

Bluetooth関連のパッケージをインストール

pi@raspberrypi ~ $ sudo apt-get install bluetooth bluez bluez-utils

 

RasPiがUSBBTを認識していることを確認

pi@raspberrypi ~ $ lsusb

Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 007: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]

 

きちんとBluetooth Dongleが表示されますね。

 

BDアドレスを取得

次にペアリングしたい対象を接続状態にしてBD(Bluetooth Device)アドレスを取得可能状態にする。対象(今回は無線キーボード)を接続状態にして次のコマンドを入力

pi@raspberrypi ~ $ hcitool scan
Scanning ...
XX:XX:XX:XX:XX:XX mac_cat
XX:XX:XX:XX:XX:XX TK-FBP014series

 

「XX:XX:〜」のところには16進数の数値がそれぞれ入る。

今回は下のTK-FBP014seriesというのが接続したい無線キーボードのこと。

 

ペアリング

次のコマンドを入力してペアリングを行う

pi@raspberrypi ~ $ sudo bluez-simple-agent hci0 XX:XX:XX:XX:XX:XX
RequestPinCode (/org/bluez/2183/hci0/dev_XX_XX_XX_XX_XX_XX)
Enter PIN Code: 9876                    <---------- 操作側からPINコードを入力
Release                                          <---------- 無線キーボード側から同じ番号を入力
New device (/org/bluez/2183/hci0/dev_XX_XX_XX_XX_XX_XX)

 

これで認識される。

ちなみに入力にちんたらしていたら下みたいになる

pi@raspberrypi ~ $ sudo bluez-simple-agent hci0 XX:XX:XX:XX:XX:XX
RequestPinCode (/org/bluez/2183/hci0/dev_XX_XX_XX_XX_XX_XX)
Enter PIN Code: 9876
Cancel
Creating device failed: org.bluez.Error.AuthenticationTimeout: Authentication Timeout

 

はいー。これでbluetoothキーボードを使用できるようになりました。

bluetoothマウスを使用したい場合は同じようにBDアドレスを登録すればいいだけです。

 

起動時に自動でペアリングする

起動するたびに毎回sshで接続してコマンドを打ってというのも面倒くさいので自動で接続するようにする。

pi@raspberrypi ~ $ sudo bluez-test-device trusted XX:XX:XX:XX:XX:XX yes
pi@raspberrypi ~ $ sudo bluez-test-input connect XX:XX:XX:XX:XX:XX

 

 

 

 

 

 

 

MacからRaspberryPiをリモート操作(ssh)

前回の記事でMacからRaspberryPiにVNCでリモート接続を行いました。

今回はMacからRaspberryPiにsshでリモート接続を行います。

 

参考にしたのはこちらの記事。

makining.com

 

RasPiはCUIの状態。

RaspberryPiのIPアドレスを調べる

RasPiのIPアドレスを知るために次のコマンドを入力

pi@raspberrypi ~ $ sudo hostname -I

結果として、[111.222.33.44]というような答えが帰ってきます。これがRasPiのIPアドレスなのでメモしておく。

 

Terminalからssh接続する

Macならばデフォルトでターミナルがあるので起動して次のコマンドを入力

pi@raspberrypi ~ $ ssh pi@111.222.33.44

初めて接続する際には[yes/no]の質問をされるので「yes」を打ち込めば問題ない。

次にパスワードの入力を求められるので入力する。RaspberryPiのパスワードは変えていなければ「raspberry」。

これでMacからssh経由でRaspberryPiにつなげることができました。

 

ね、簡単でしょ?

 

 

 

VNC接続時にGDBus.Error

前回はRasPiにtightvncserverをインストールしてMacからリモート接続するところまでやりました。

RasPiの画面が出てきたのはいいが、何やらエラーが出ている模様。

f:id:chironeko0527:20150423063150p:plain

GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: An authentication agent already exists for the given subject

どうしたらいいんじゃほいとGoogle先生に聞いてみたところ次のサイトが参考になりました。

blog.livedoor.jp

 

ふむふむ、まぁ、つまりは次のファイルをいじれよというわけね。

ファイル /etc/xdg/autostart/lxpolkit.desktop

変更内容
NotShowIn=GNOME;KDE;
 ↓
NotShowIn=GNOME;KDE;LXDE

pi@raspberrypi ~ $ sudo cat /etc/xdg/autostar/lxpolkit.desktop

とやると確かに「NotShowIn=GNOME;KDE;」となっている。じゃあ直そう。

pi@raspberrypi ~ $ sudo nano /etc/xdg/autostar/lxpolkit.desktop

でメモ帳を開いて編集

 

できたらRasPiを再起動してvncを立ち上げ直す。すると無事エラーは表示されなくなりました。よしよし。