python get image from video using cv2 (VIDEOIO ERROR: V4L: can't find camera device)

Posted by nopsled
2019.01.30 10:59 프로그래밍

* MENTION : Ubuntu 16.05 LTS with python 2.7 installed on Azure.


This example works fine on my local. but doesn't work on my VM. so i'm keep messing up.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2
 
def video2frame(invideofilename, save_path):
    vidcap = cv2.VideoCapture(invideofilename)
    count = 0
    while True:
        success,image = vidcap.read()
        if not success:
            break
        print ('Read a new frame: ', success)
        fname = "{}.jpg".format("{0:05d}".format(count))
        cv2.imwrite(save_path + fname, image) # save frame as JPEG file
        count += 1
    print("{} images are extracted in {}."format(count, save_path))
cs


but, finally i realized that my virtual machine doesn't have any carmera device.


1
2
3
4
5
6
7
8
9
10
11
Python 2.7.12 (default, Nov 12 201814:36:49)
[GCC 5.4.0 20160609] on linux2
Type "help""copyright""credits" or "license" for more information.
>>> import cv2
>>> cv2.VideoCapture(0)
VIDEOIO ERROR: V4L: can't open camera by index 0
<VideoCapture 0x7f44197b6810>
>>> cv2.VideoCapture(-1)
VIDEOIO ERROR: V4L: can't find camera device
<VideoCapture 0x7f44197b6770>
>>>
cs


i'm try to install many things.


1
2
3
4
5
6
7
8
9
git clone https://github.com/opencv/opencv.git
 
mkdir build
 
cd build
 
cmake ../opencv
 
make
cs



1
sudo apt-get install cheese libav-tools libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libx264-dev
cs


but finally resolve this problem when i install this opencv and many libs.






* additional : still doesn't work if i use cv2.VideoCapture from video url. so i have to change logic. just use local video path if you use get video meta from video url.


1
2
3
4
5
6
7
# don't use like this if you doing on VM with cv2 module.
import cv2
vid = cv2.VideoCapture("https://example.com/test.mp4")
success, img = vid.read()
if success:
    print len(img)
    print type(img)
cs


1
2
3
4
5
6
7
# change from video url to local path.
import cv2
vid = cv2.VideoCapture("./video.mp4")
success, img = vid.read()
if success:
    print len(img)
    print type(img)
cs


Don't use video url. if you doing on VM with cv2 module.




이 댓글을 비밀 댓글로

Mac apache 2.4.34 VirtualHost, ProxyPass 적용하기

Posted by nopsled
2019.01.14 13:30 운영체제

nopsled@Sangui-MacBookPro:/etc/apache2 (=`ω´=)$ apachectl -V

Server version: Apache/2.4.34 (Unix)

Server built:   Aug 17 2018 18:35:43

Server's Module Magic Number: 20120211:79

Server loaded:  APR 1.5.2, APR-UTIL 1.5.4

Compiled using: APR 1.5.2, APR-UTIL 1.5.4

Architecture:   64-bit

Server MPM:     prefork

  threaded:     no

    forked:     yes (variable process count)

Server compiled with....

 -D APR_HAS_SENDFILE

 -D APR_HAS_MMAP

 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)

 -D APR_USE_FLOCK_SERIALIZE

 -D APR_USE_PTHREAD_SERIALIZE

 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT

 -D APR_HAS_OTHER_CHILD

 -D AP_HAVE_RELIABLE_PIPED_LOGS

 -D DYNAMIC_MODULE_LIMIT=256

 -D HTTPD_ROOT="/usr"

 -D SUEXEC_BIN="/usr/bin/suexec"

 -D DEFAULT_PIDLOG="/private/var/run/httpd.pid"

 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"

 -D DEFAULT_ERRORLOG="logs/error_log"

 -D AP_TYPES_CONFIG_FILE="/private/etc/apache2/mime.types"

 -D SERVER_CONFIG_FILE="/private/etc/apache2/httpd.conf" 



nopsled@Sangui-MacBookPro:/etc/apache2 (=`ω´=)$ tree .

.

├── extra

│   ├── httpd-autoindex.conf

│   ├── httpd-dav.conf

│   ├── httpd-default.conf

│   ├── httpd-info.conf

│   ├── httpd-languages.conf

│   ├── httpd-manual.conf

│   ├── httpd-mpm.conf

│   ├── httpd-multilang-errordoc.conf

│   ├── httpd-ssl.conf

│   ├── httpd-userdir.conf

│   ├── httpd-vhosts.conf

│   └── proxy-html.conf

├── httpd.conf

├── httpd.conf.pre-update

├── magic

├── mime.types

├── original

│   ├── extra

│   │   ├── httpd-autoindex.conf

│   │   ├── httpd-dav.conf

│   │   ├── httpd-default.conf

│   │   ├── httpd-info.conf

│   │   ├── httpd-languages.conf

│   │   ├── httpd-manual.conf

│   │   ├── httpd-mpm.conf

│   │   ├── httpd-multilang-errordoc.conf

│   │   ├── httpd-ssl.conf

│   │   ├── httpd-userdir.conf

│   │   ├── httpd-vhosts.conf

│   │   └── proxy-html.conf

│   └── httpd.conf

├── other

│   └── php7.conf

└── users

    └── Guest.conf


5 directories, 31 files

nopsled@Sangui-MacBookPro:/etc/apache2 (=`ω´=)$ 


Python flask wsgi 적용하기 귀찮아서 위처럼 사용하고 있다... (이러면 안되는거 알지만.......)


아무튼 Apache 2.4.34, Apache 디렉토리에 뭐가 있는지 확인했는데 똑같으면 아래와 같이 따라하면 된다.




LoadModule proxy_html_module libexec/apache2/mod_proxy_html.so

LoadModule proxy_module libexec/apache2/mod_proxy.so

LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so

# proxy module 주석을 제거 해준다.


DocumentRoot "/var/www/default"

<Directory "/var/www/default">

    Options FollowSymLinks Multiviews Indexes

    MultiviewsMatch Any

    AllowOverride all

    Require all granted

    Allow from all

</Directory>

# DocumentRoot의 default 위치 지정 (기본적으로 127.0.0.1, localhost라고 생각하면 됨)


Include /private/etc/apache2/extra/httpd-vhosts.conf

# httpd-vhosts.conf 파일을 include 시켜준다.



sudo vi /etc/apache2/httpd.conf


sudo로 httpd.conf 파일을 열어서 위와 같이 수정 및 추가한다.




<VirtualHost scope.nopsled.local:80>

    ServerAdmin scope@admin.scope.com # 아무거나 써도 된다

    ServerName scope.nopsledlocal # 아무거나 써도 된다

    ServerAlias scope.nopsled.local # 아무거나 써도 된다

    DocumentRoot "/var/www/scope" # DocumentRoot 지정

    ErrorLog "/private/var/log/apache2/scope-error.log"

    CustomLog "/private/var/log/apache2/scope-access.log" common

    <Directory /var/www/scope> # 여기서도 DocumentRoot 지정

        Allow from all

        AllowOverride All

        Require all granted

        Options Indexes FollowSymLinks MultiViews

    </Directory>


    <IfModule mod_rewrite.c>

        # mod_rewrite.c Module이 있는 경우 아래 실행

        RewriteEngine On

        # RewriteEngine 키고

        ProxyPass / http://127.0.0.1:8080/

        # /로 들어온 모든 사용자는 127.0.0.1:8080를 프록시로 사용

        ProxyPreserveHost On

        ProxyErrorOverride Off

        # Error는 override하지 않는다

    </IfModule>

</VirtualHost>


<VirtualHost 127.0.0.1:80 localhost:80>

    # 위 도메인 외에 127.0.0.1:80, localhost:80에 접속하는 사용자는 아래와 같이 포워딩한다

    ServerAdmin nopsled@localhost

    ServerName nopsled.localhost

    DocumentRoot "/var/www/default"

    ErrorLog "/private/var/log/apache2/default-error.log"

    CustomLog "/private/var/log/apache2/default-access.log" common

    <Directory /var/www/default>

        Allow from all

        Require all granted

        AllowOverride all

    </Directory>

</VirtualHost>


sudo vi /etc/apache2/extra/httpd-vhosts.conf

httpd-vhosts.conf를 sudo로 열어서 위와 같이 수정해준다.



##

# Host Database

#

# localhost is used to configure the loopback interface

# when the system is booting.  Do not change this entry.

##

127.0.0.1   localhost

255.255.255.255 broadcasthost

::1             localhost

127.0.0.1 scope.nopsled.local 


sudo vi /etc/hosts

hosts를 열어서 위와 같이 마지막에 추가해준다.


이제 열어보면 잘된다. 이렇게 했는데도 안되면 /var/log/apache2/에 있는 error.log를 참고하면서 trouble shooting하면 된다.



이 댓글을 비밀 댓글로

MongoDB 유저생성 및 데이터베이스 생성

Posted by nopsled
2019.01.08 09:52 데이터베이스

회사에서 맨날 MongoDB를 사용하고 있는데 설정한다고 구글 검색하기가 귀찮아서 따로 만들어봤다.


public으로 설정이 잘못되어 있어서 하마터면 털릴뻔했다 ㅡㅡ..


MongoDB port(27017)을 인바운드와 noauth로 열어주는 경우엔 잘못하면 털린다.


그렇다면 이 설정을 어떻게 피하냐면.. 다음과 같이 하면 된다.


몽고디비를 새로 설치한 후 초기 셋팅이라고 생각하면 된다.





1. 초기에는 authorization이 disabled 되어 있으므로 그냥 mongo 쉘 커맨드로 접속하면 된다.

mongo 



2. admin DB를 생성하여 모든 DB에 접속할 권한을 준다.

use admin
db.createUser( { user: "<username>",
          pwd: "<password>",
          roles: [ "userAdminAnyDatabase",
                   "dbAdminAnyDatabase",
                   "readWriteAnyDatabase"

] } ) 


3. 다음은 사용자가 원하는 DB를 만들때 셋팅이다. (이 경우 해당 디비에만 권한을 받는다.)

use myDB
db.createUser({ user: "<username>",
          pwd: "<password>",
          roles: ["dbAdmin", "readWrite"]

}) 


+ 사용자를 drop 시킬때 쓰는 명령이다. (거의 쓸일 없다)

use admin

db.dropUser("<username>") 





4. 몽고로 쉘 커맨드로 접속하여 나오는 버전명을 보고 케이스를 나눠서 진행한다. (솔직히 2버전대 아니면 별 의미없는것 같다.)

Case1 : MongoDB shell version v4.0.4, MongoDB server version: 4.0.4

sudo vi /etc/mongod.conf 


# mongod.conf


storage:

  dbPath: /data/db

  #dbPath: /var/lib/mongodb

  # if you want to custom MongoDB Path, modify dbPath line.

  journal:

    enabled: true


net:

   bindIp: 127.0.0.1

   port: 27017


security:

   authorization: "enabled"

   #authorization: "disabled" 

   # if you want to disable authorization, uncomment disabled line.


processManagement:

  timeZoneInfo: /usr/share/zoneinfo

   # If you use this timeZoneInfo, will be following your localtime


# where to write logging data.

systemLog:

   destination: file

   logAppend: true

   path: /var/log/mongodb/mongod.log

# If path permission has root:root, executed user(general user) can't access that file.

# Check path's permission. it followed executed permission.


Case2 : MongoDB shell version v3.6.7, MongoDB server version: 3.6.5

 sudo vi /etc/mongod.conf


# mongod.conf


# Where and how to store data.

storage:

  dbPath: /var/lib/mongodb

  journal:

    enabled: true


# where to write logging data.

systemLog:

  destination: file

  logAppend: true

  path: /var/log/mongodb/mongod.log

# If path permission has root:root, executed user(general user) can't access that file.

# Check path's permission. it followed executed permission.


# network interfaces

net:

  port: 27017

  bindIp: 127.0.0.1


# how the process runs

processManagement:

  timeZoneInfo: /usr/share/zoneinfo

   # If you use this timeZoneInfo, will be following your localtime


security:

   authorization: "enabled"

   #authorization: "disabled" 

   # if you want to disable authorization, uncomment disabled line.


이렇게 하고 robo로 접속 테스팅해본다.


참고로..bindIp를 걸어놓으면 로컬로 밖에 접속을 못하니 robo에서는 SSH 터널링을 통해 접속해야한다.


DB가 털리는 상황은 bindIp를 주석처리하고 authorization을 disabled하는 경우다. 올바른 설정을 위해선 bindIp를 걸어주거나 authorization을 enabled해준다. 둘중 하나만 설정되어 있다면 털릴 걱정 안해도 된다.



+ 참고 및 출처 : http://blog.freezner.com/archives/1040

이 댓글을 비밀 댓글로