質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2510閲覧

Python上で、2つのシステムを1つのプログラムとして同時に起動したいです。

tomatoma...

総合スコア15

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/12 14:31

前提・実現したいこと

Pythonを使用したプログラムで、webカメラを使用した動くものを追跡するtrackingのプログラムと、マイクを使用した音声波形が出るシステムを同時に起動するプログラムを作成したいのですが、2つをうまく合わせることが出来ません。

問題点として発覚しているのは、マイクを使用した音声波形が出るプログラムが、ループを繰り返していて、webカメラを使用したtrackingのプログラムが起動しません。

発生している問題・エラーメッセージ

エラーは起きていません

該当のソースコード

Python

1# -*- coding:utf-8 -*- 2 3import pyqtgraph as pg 4from pyqtgraph.Qt import QtCore, QtGui 5import numpy as np 6import scipy.signal 7import sys 8import RPi.GPIO as GPIO 9import pyaudio 10import struct 11import cv2 12 13#from PySide import QtGui, QtCore 14import sys 15import threading 16import time 17 18 19PIN_1 = 35 20#PIN_2 = 37 21#PIN_3 = 38 22PIN_4 = 40 23 24cap = cv2.VideoCapture(0) 25 26class PlotWindow: 27 def __init__(self): 28 #プロット初期設定 29 self.win=pg.GraphicsWindow() 30 self.win.setWindowTitle(u"リアルタイムプロット") 31 self.win.nextColumn() 32 self.plt1=self.win.addPlot(title="Left") #プロットのビジュアル関係 33 self.plt1.setYRange(0,100) 34 self.plt1.setXRange(100,2000) #y軸の上限、下限の設定 35 self.plt2=self.win.addPlot(title="Right") #プロットのビジュアル関係 36 self.plt2.setYRange(0,100) #y軸の上限、下限の設定 37 self.plt2.setXRange(100,2000) 38 39 #マイクインプット設定 40 self.CHUNK=4096 #1度に読み取る音声のデータ幅 41 self.RATE=44100 #サンプリング周波数 42 self.audio=pyaudio.PyAudio() 43 self.stream=self.audio.open(format=pyaudio.paInt16,#取り込んだ音声フォーマット指定 44 channels=2,#入力チャンネル(2ならステレオ) 45 rate=self.RATE,#サンプリングレート 46 input=True,#入力を許可 47 frames_per_buffer=self.CHUNK) 48 49 50 #アップデート時間設定 51 self.timer=QtCore.QTimer() 52 self.timer.timeout.connect(self.update) 53 self.timer.start(10) #10msごとにupdateを呼び出し 54 55 #音声データの格納場所(プロットデータ) 56 self.data=np.zeros(self.CHUNK) 57 58 GPIO.setmode(GPIO.BOARD) 59 GPIO.setup(PIN_1,GPIO.OUT) 60 #GPIO.setup(PIN_2,GPIO.OUT) 61 #GPIO.setup(PIN_3,GPIO.OUT) 62 GPIO.setup(PIN_4,GPIO.OUT) 63 64 65 66 def update(self): 67 self.data=self.AudioInput() 68 self.data=[self.data[2::2],self.data[3::2]]#音声データを左右に分離 69 70 #左右の音声をFFT変換してスペクトルアナライザーとして表示する 71 self.axis=[np.fft.fftfreq(len(self.data[0]), d=1.0/self.RATE),np.fft.fftfreq(len(self.data[1]), d=1.0/self.RATE)] 72 self.plt1.plot(x=self.axis[0],y=self.FFT_AMP(self.data[0]),clear=True) 73 self.plt2.plot(x=self.axis[1],y=self.FFT_AMP(self.data[1]),clear=True) 74 75 #相関係数を求める部分 76 corr=[] 77 for i in range(-45,45): 78 corr.append(np.corrcoef(self.data[0][45:1000],self.data[1][45+i:1000+i])[0,1]) 79 80 #最大相関係数を出力 81 #print(np.argmax(corr)) 82 83 #最大相関係数の値によって回転する方向を出力 84 if np.argmax(corr) <= 46 and np.argmax(corr)>= 44: 85 GPIO.output(PIN_1,True) 86 GPIO.output(PIN_4,True) 87 elif np.argmax(corr) > 47: 88 GPIO.output(PIN_4,False) 89 GPIO.output(PIN_1,True) 90 elif np.argmax(corr) < 43: 91 GPIO.output(PIN_1,False) 92 GPIO.output(PIN_4,True) 93 94 95 96 #音声を取り込む部分 97 def AudioInput(self): 98 try: 99 ret=self.stream.read(self.CHUNK) #音声の読み取り(バイナリ) 100 except: 101 self.stream=self.audio.open(format=pyaudio.paInt16, 102 channels=2, 103 rate=self.RATE, 104 input=True, 105 frames_per_buffer=self.CHUNK) 106 ret=self.stream.read(self.CHUNK) 107 #バイナリ → 数値(int16)に変換 108 #32768.0=2^16で割ってるのは正規化(絶対値を1以下にすること) 109 ret=np.frombuffer(ret, dtype="int16")/32768.0 110 return ret 111 112 #FFT変換 113 def FFT_AMP(self, data): 114 data=np.hamming(len(data))*data 115 data=np.fft.fft(data) 116 data=np.abs(data) 117 return data 118 119 120 121if __name__=="__main__": 122 #リアルタイムプロット開始 123 plotwin=PlotWindow() 124 125cap = cv2.VideoCapture(0) 126before = None 127while True: 128 # OpenCVでWebカメラの画像を取り込む 129 ret, frame = cap.read() 130 131 # スクリーンショットを撮りたい関係で1/4サイズに縮小 132 frame = cv2.resize(frame, (int(frame.shape[1]/4), int(frame.shape[0]/4))) 133 # 加工なし画像を表示する 134 cv2.imshow('Raw Frame', frame) 135 136 # 取り込んだフレームに対して差分をとって動いているところが明るい画像を作る 137 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 138 if before is None: 139 before = gray.copy().astype('float') 140 continue 141 # 現フレームと前フレームの加重平均を使うと良いらしい 142 cv2.accumulateWeighted(gray, before, 0.5) 143 mdframe = cv2.absdiff(gray, cv2.convertScaleAbs(before)) 144 # 動いているところが明るい画像を表示する 145 cv2.imshow('MotionDetected Frame', mdframe) 146 147 # 動いているエリアの面積を計算してちょうどいい検出結果を抽出する 148 thresh = cv2.threshold(mdframe, 3, 255, cv2.THRESH_BINARY)[1] 149 # 輪郭データに変換しくれるfindContours 150 image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 151 max_area = 0 152 target = contours[0] 153 for cnt in contours: 154 #輪郭の面積を求めてくれるcontourArea 155 area = cv2.contourArea(cnt) 156 if max_area < area and area < 10000 and area > 1000: 157 max_area = area; 158 target = cnt 159 160 # 動いているエリアのうちそこそこの大きさのものがあればそれを矩形で表示する 161 if max_area <= 1000: 162 areaframe = frame 163 cv2.putText(areaframe, 'not detected', (0,50), cv2.FONT_HERSHEY_PLAIN, 3, (0, 255,0), 3, cv2.LINE_AA) 164 else: 165 # 諸般の事情で矩形検出とした。 166 x,y,w,h = cv2.boundingRect(target) 167 areaframe = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) 168 169 cv2.imshow('MotionDetected Area Frame', areaframe) 170 171 172 173 # キー入力を1ms待って、k が27(ESC)だったらtrackingする 174 k = cv2.waitKey(1) 175 if k == 27: 176 break 177 178 # キャプチャをリリースして、ウィンドウをすべて閉じる 179cap.release() 180cv2.destroyAllWindows()

試したこと

スレッドを使って、2つのプログラムを並列処理を試しました。
結果は、変わりませんでした。。。

補足情報(FW/ツールのバージョンなど)

Python2.7
opencv3.1.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

morinatsu

2018/10/12 14:56

1本にまとめる必要はどの辺にあるのでしょうか。2つのプログラムを並行で動かせば済む話のような。
tiitoi

2018/10/12 14:58

OS は Windows/Linux どちらでしょうか?ターミナルを2つ開いてそれぞれ Python スクリプトを実行するのでは駄目なのでしょうか
tomatoma...

2018/10/12 15:32

osは、Linuxです!音の波形のプログラムは、詳しくは音が出た方向にマイクが動き、それを波形で表しているシステムです。ですので、将来的には、トラッキングとマイクの追尾システムをうまく組み合わせて制御したいと考えています。
guest

回答1

0

ベストアンサー

シェルスクリプト用意しておいて、2つバックエンドで起動するのでは駄目なのでしょうか?

サンプルコード

run.sh

bash

1python test1.py & 2python test2.py &

test1.py

python

1import time 2 3while True: 4 print('test1') 5 time.sleep(3)

test2.py

python

1import time 2 3while True: 4 print('test2') 5 time.sleep(3)
$ bash run.sh test2 test1 test2 test1 ...

投稿2018/10/12 15:38

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomatoma...

2018/10/12 16:32

将来的に2つのシステムを使って1つのプログラムにして、制御などしたいので、合体させたいのです。゚(゚´ω`゚)゚。
tiitoi

2018/10/12 16:38 編集

では、Python の multiprocessing.Process モジュールを使いましょう。 https://www.yoheim.net/blog.php?q=20170601 スレッドで並列に動かす必要があります。 使い方について情報収集し、試してみて、わからないことがあったら聞いてください。
tomatoma...

2018/10/12 23:21

ありがとうございます! 参考にさせて頂きます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問