2016-12-30 2 views
0

私はpythonでraspberry piにコードを書き、平均二乗誤差を使って二つの画像を比較しています。このプロジェクトは個人的な家庭のセキュリティです。openCVで画像の比較をより粗くするには

私の主な目標は、私がpiカメラからキャプチャした画像(何かが現在の画像に追加されたものか、画像から削除されたもの)の間の変化を検出することです。それは、私が欲しくない背景の照明の変化の影響を受けます。

私の前に2つのオプションがあり、現在のロジックを掻き集めて新しいロジックを開始するか、またはこれらのノイズを考慮して現在のロジックを改善しています。私は自分のロジックを改善する方法を模索していますが、私はそれについてどうやっていくべきかについての指針を求めました。

私の最大の恐怖であることは、私が死んだ馬を蹴って時間を無駄にしていたり​​、エッジ検出

import numpy as np 
import cv2 
import os 
from threading import Thread 
######Function Definition######################################## 
def mse(imageA, imageB): 
    # the 'Mean Squared Error' between the two images is the 
    # sum of the squared difference between the two images; 
    # NOTE: the two images must have the same dimension 
    err = np.sum((imageA.astype("int") - imageB.astype("int")) ** 2) 
    err /= int(imageA.shape[0] * imageA.shape[1]) 

    # return the MSE, the lower the error, the more "similar" 
    # the two images are 
    return err 

def compare_images(imageA, imageB): 
    # compute the mean squared error 
    m = mse(imageA, imageB) 
    print(m) 


def capture_image(): 
     ##shell command to click photos 
     os.system(image_args) 

##original image Path variable 
original_image_path= "/home/pi/Downloads/python-compare-two-images/originalimage.png" 

##original_image_args is a shell command to click photos 
original_image_args="raspistill -o "+original_image_path+" -w 320 -h 240 -q 50 -t 500" 
os.system(original_image_args) 

##read the greyscale of the image in to the variable original_image 
original_image=cv2.imread(original_image_path, 0) 

##Three images 
image_args="raspistill -o /home/pi/Downloads/python-compare-two-images/Test_Images/image.png -w 320 -h 240 -q 50 --nopreview -t 10 --exposure sports" 
image_path="/home/pi/Downloads/python-compare-two-images/Test_Images/" 
image1_name="image.png" 

#created a new thread to take pictures 
My_Thread=Thread(target=capture_image) 

#Thread started 
My_Thread.start() 

flag = 0 
while(True): 
     if(My_Thread.isAlive()==True): 
       flag=0 
     else: 
       flag=1 
     if(flag==1): 
       flag=0 
       image1 = cv2.imread((image_path+image1_name), 0) 
       My_Thread=Thread(target=capture_image) 
       My_Thread.start() 
       compare_images(original_image, image1) 

答えて

0

を私はちょうど画像の変化を検出するために、いくつかの他のアルゴリズムを探す必要がありますか、私が使用する必要がある最初の改善がにあります光の全体的な変化を補償するために利得を調整する。 2つの画像の平均強度を取って強度の比で補正することと同じように。

これは、フォアグラウンドが変更された場合に失敗し、グローバル平均に影響します。フォアグランドの変化が大きすぎない場合は、線形モデルy = a.xの強固なフィッティングによって推定値を得ることができます。

しかし、残念ながら一般的なシナリオは、バックグラウンドイルミネーションが不均一な形で変化する場合です。部分解は、コーナーで推定されたゲイン間の双線形補間によって得られるような不均一なゲインモデル、または画像のより細かい細分化を試みることである。

+0

この場合のゲインは、compare_image()関数の 'm'になります –

+0

@ShravanSingh:ではありませんすべて。平均の比率になるでしょう。 –

0

変化検出のトピックは非常に研究された分野です。基本的なオプションの1つは、各ピクセルの多数の画像をサンプリングし、各ピクセルの平均および分散を計算することによって、各ピクセルをガウス分布としてモデル化することです。

照明が変化したときに変化する傾向のあるピクセルの場合、ピクセルの分散はそれほど変化しないものよりも大きくなります。

特定のピクセルの動きを検出するには、ピクセル値の順序が変化しないと考える確率を選択し、算出したガウス分布を使用して、 。

ラズベリーパイの効率的なソリューションを作成するには、ピクセル値の変化が動きとみなされるしきい値となる各ピクセルの値の「オフライン」計算を最初に実行し、保存する必要があります「オンライン」セージよりも、各ピクセルを計算された値と比較するだけです。

「オフライン」の段階では、1日にレコーダーであった画像を使用して、ピクセルごとに必要なすべてのバリエーションを取得することをおすすめします。この段階の呪いはあなたのコンピュータ上で実行でき、出力ファイルのみがラズベリーにアップロードされます