blank page

プログラミングなどについて書きます

FlaskとOpenCVを使っていたらVIDEOIO ERRORなるものでハマった

Flask && OpenCV

サーバーにアクセスが来たらOpenCVを使ってWEBカメラから写真をとっていろいろするみたいなコードを書いていた時にハマったことがあったのでメモメモ…  

起こったこと

VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
Unable to stop the stream: Device or resource busy

こういうエラーで,カメラが使えないぜ馬鹿野郎と言われています.
           

環境

OS: Ubuntu 16.04 xenial
Kernel: x86_64 Linux 4.4.0-93-generic
🐍 miniconda3-4.1.11

この他に,raspi3でもエラーが出るのを確認しました.
  

     

Sample code

import cv2
from flask import Flask

cap = cv2.VideoCapture(0)
app = Flask(__name__)

@app.route("/")
def hoge():
    _, frame = cap.read()
    """
        ここでいろいろする
    """
    return "HOGE"

if __name__ == "__main__":
    app.run(debug=True)

   

みたいなコードです.

 

いろいろ省いたりしていますがこれを実行すると…

     

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
Unable to stop the stream: Device or resource busy

   

鯖は立ち上がるがVIDEOIO ERRORが出ます:innocent: ぐぐっても解決策の載ってる記事が見つかりませんでした…(自明的なことなのかな)
 
 
 
これに1日あるかないかくらい時間を取られました…
 
まじかなpeopleです.
    

解決方法

app.run(debug=True)debug=TrueFalseにするか消しましょう.
それを保存して実行すると動きます.(自分の環境では)
 
 

おわり

正直理由はこんな感じなんかな〜(?)程度でしかわかってないのでわかるかたぜひ教えてくれると嬉しいです〜!

FlaskでWebアプリケーションを書くときの自分が使うディレクトリ構成のメモ

メモ

メモです.
自分がFlaskでWebアプリケーションか何かを書くときのディレクトリ構成をメモしておきます.

本当に構成しか載せてません :construction:
これは罠で最後にパッケージ管理の何かの話を書いている

小さいアプリケーション

.
├── LICENSE
├── README.md
├── Pipfile
├── Pipfile.lock
├── app.py
└── config.py

基本的にはこんな感じですが,app.pyが大きくなってきた場合は適当にview分けたりしてます.

大きめのやつ

このくらいのやつを書くくらいからはBlueprintを使っています.

.
├── LICENSE
├── Pipfile
├── Pipfile.lock
├── README.md
├── app
│   ├── __init__.py
│   ├── __pycache__
│   ├── config.py
│   ├── statics
│   │   ├── css
│   │   ├── img
│   │   └── js
│   ├── templates
│   │   └── template.html
│   └── views
│       ├── __init__.py
│       ├── __pycache__
│       └── view.py 
│
└── server.py

ファイル名は例です;)

このほかに必要なものが出てきたら,適宜ディレクトリをapp内に生やしたりすると良いです.
大きめとありますが,初心者が作る程度の構成です.

パッケージ管理

最近からpipenvを使い始めましたが,なかなか良さです;)

github.com

前まではpyenv + pyenv-virtualenvを使っていたのですが,pipenvは導入が楽すぎて楽なので楽って感じです.(pip install pipenvで終わるため)

AtCoder Regular Contest 082 & AtCoder Beginner Contest 072

ABC全完したので一応報告

初めてABC全完したので適当にコードを書いておこうと思います.

A

A - Sandglass2

やる

#include <iostream>
using namespace std;

int main()
{
  int x, t;

  cin >> x >> t;
  if (x - t <= 0) {
    cout << 0 << endl;
  } else {
    cout << x - t << endl;
  }

  return (0);
}

B

B - OddString

やる.

#include <iostream>
#include <string>
using namespace std;

int main()
{
  string s;
  
  cin >> s;
  for (int i = 0; i < s.size(); i++) {

    if (i % 2 == 0) {
      cout << s[i];
    }
  }
  cout << endl;

  return (0);
}

C

C - Together

割と時間かかった. 思いついたら簡単だった.

#include <bits/stdc++.h>
using namespace std;

int res[100005];

int main()
{
  int n;
  cin >> n;

  for (int i = 0; i < n; i++) {
    int tmp;
    cin >> tmp;

    res[tmp]++;
    res[tmp + 1]++;
    res[tmp - 1]++;
  }

  int max = -100;
  for (int i = 0; i < 100005; i++) {
    if (max < res[i]) {
      max = res[i];
    }
  }

  cout << max << endl;

  return (0);
}

maxを変数にするのはまずいですね…反省…(´・ω・`)

D

D - Derangement

簡単でした.

#include <bits/stdc++.h>
using namespace std;

int main()
{
  int n;
  cin >> n;
  vector<int> p(n);
  int cnt = 0;

  for (int i = 0; i < n; i++) {
    cin >> p[i];
  }

  for (int i = 0; i < n; i++) {
    if (p[i] == i + 1) {
      if (i != n - 1) {
        swap(p[i], p[i + 1]);
        cnt++;
      }
      else {
        swap(p[i], p[i - 1]);
        cnt++;
      }
    }
  }

  cout << cnt << endl;

  return (0);
}

Manjaroでvagrant upしようとしたら怒られた><

怒られました><

isuconの過去問を動かそうと思ってvagrant upしたらこんなエラーが出てきました.

VirtualBox is complaining that the kernel module is not loaded. Please run VBoxManage --version or open the VirtualBox GUI to see the error message which should contain instructions on how to fix this error.

Please run VboxManage --versionとかいているので実行してみると,

WARNING: The vboxdrv kernel module is not loaded. Either there is no module
         available for the current kernel (4.9.39-1-MANJARO) or it failed to
         load. Please recompile the kernel module and install it by

           sudo /sbin/vboxconfig

         You will not be able to start VMs until this problem is fixed.
5.1.24r117012

的なことが返されて,sudo /sbin/vboxconfigとか打ったら優勝ではwみたいなことを思い打ってみると,

sudo: /sbin/vboxconfig: コマンドが見つかりません

なるほどね.完全に理解した.(してない) :innocent:

完全に理解した僕はGoogle先生にエラーメッセージ + manjaroという単語をつけて投げました.
すると優秀なGoogle先生は下のサイトを返してくれました><

unix.stackexchange.com

なるほどね.完全に理解した.(英語がだめなので1mmも理解していない)

雰囲気からなんかインストールしろと言われてるっぽいのであやしい何かをインストールしたら解決しちゃったwというはなしです.

ゔぁーぢょん

OS: Manjaro 17.0.2 Gellivara
Kernel: x86_64 Linux 4.9.39-1-MANJARO
virtualbox-5.1.24-2
Vagrant 1.9.7

解決した方法

下のやつをポチポチした.

$ uname -r
# 自分の環境では4.9.39-1-MANJAROが返ってきました. 
$ yaourt -S linux49-virtualbox-host-modules

とやるとちゃんと動いてくれました><
めでたしめでたし

yaourt -S linux49-vir....のlinux49とかはversionに合わせて変えてください.
yaourtの一つ前のuname -rで返ってきた4.9.39-1-MANJAROの最初のところのやつです(雰囲気で読み取って)

hoge

調べたときに日本語のサイトがあんまりなかったので書いてみました><
間違ってるとかちゃうやろとかあったら教えてください

できへんやが><みたいな人いたらtwitterかコメントで聞いてくれたら自分のできる範囲でお答え島.

勢いで書いたので日本語がだめ.
全然関係ない話ですが,この記事を書いたのはテスト5日前くらいです.未だに勉強始めてないです.:)