OpenCV4で出会った初歩的なエラー対処しました。

2021-10-10

はじめに

嫁にせがまれたので、飼い犬のLINEスタンプを作って公開しました。数は少ないけどね。 作ったのは良いけど、飼い犬のLINEスタンプなんて自己満足以上の何者でも無いよなとか脳裏をよぎりもしましたが、 作る作業自体は結構楽しかったので、またやりたいですね。

イケメンチワワのもっちん そんなわけで、8個120円は高いなと自分でも思いますがよろしく。30円ぐらい私の手元に入ります。

今日の本題はOpenCV触ってたら出会うバグを潰しこみをしましたよって話です。 もっとこう、Flutterとかの記事書きたがアルバイトが一段落するまではGo+Raspberry pi+OpenCV周りを叩きます。

OpenCV周り特有のエラー

The total matrix size does not fit to “size_t” type in function ‘setSize’

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.5.3) /tmp/opencv/opencv-4.5.3/modules/core/src/matrix.cpp:274: error: (-211:One of the arguments' values is out of range) The total matrix size does not fit to "size_t" type in function 'setSize'

SIGABRT: abort
PC=0xb4944f14 m=0 sigcode=4294967290

goroutine 0 [idle]:
runtime: unknown pc 0xb4944f14
stack: frame={sp:0xbed55868, fp:0x0} stack=[0xbe557214,0xbed56258)

要因としては、何故か画像として取得されるものの-XXXみたいな負の値が帰ってくることがありエラーで落ちているというものでした。 あまり原因を深堀りしても良いことなさそうなので こんな感じに、画像のサイズが負の値の場合は処理しないようにしました。

if 0 < int(float64(img.Rows())) && 0 < int(float64(img.Cols())) {
  //やりたい処理
  qr.Detect(img, &points)
  strtmp = qr.Decode(img, points, &straight_qrcode)
  if len(strtmp) > 0 {
    fmt.Println(strtmp)
    break
  }
}

とりあえず暫定対策にはなるので残します。

error: (-4:Insufficient memory) Failed to allocate 2756250000 bytes in function ‘OutOfMemoryError’

メモリ足りないよ系のエラーですね。 今回のケースだと、2.567 GBなので、Raspberry piに積んでるメモリの数を凌駕してます。 とりあえず、読み込んでいる画像を小さくするとか、メモリを解放してあげることで対処します。

4GB以上のサイズでメモリもそれ以上積んでるのになぁと言うのであれば、64Bit対応のOSを使うとかそんな話になると思います。

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.5.3) /tmp/opencv/opencv-4.5.3/modules/core/src/alloc.cpp:73: error: (-4:Insufficient memory) Failed to allocate 2756250000 bytes in function 'OutOfMemoryError'

SIGABRT: abort
PC=0xb4956f14 m=0 sigcode=4294967290
xxx.Close()

で解放できるので使い終わった変数や構造体はお片付けしましょうって話でした。

おわりに

こう見返すと出会ったエラー自体の数は少ないですね。