2013-04-26 349 views
1

爲了安全起見,我希望能夠找到差異b/w 2個類似的灰度圖像以用於系統實施。我想檢查它們之間是否有差異。對於對象跟蹤,我已經在下面的程序中實現了canny檢測。我可以很容易地得到結構化對象的輪廓..哪些cn稍後被減去以僅給出三角形圖像中差異的輪廓....但是如果在第二圖像中存在諸如煙霧或火焰之類的非結構性差異怎麼辦?我已經增加了更清晰的邊緣檢測的對比度,以及在canny fn參數中修改了閾值val。但沒有得到合適的結果。圖像差異:如何找出圖像之間的細微差異?

canny邊緣也檢測陰影邊緣。如果我在白天的不同時間拍攝兩張相似圖像,陰影會有所不同,所以邊緣會有所不同,並會產生不希望的虛假警報。

我應該如何解決此問題?誰能幫忙?謝謝! 在enter code here OpenCV的2.4使用Visual Studio中的C語言API 2010

#include "stdafx.h" 
#include "cv.h" 
#include "highgui.h" 
#include "cxcore.h" 
#include <math.h> 
#include <iostream> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 

int main() 
{ 
IplImage* img1 = NULL; 
     if ((img1 = cvLoadImage("libertyH1.jpg"))== 0) 
     { 
       printf("cvLoadImage failed\n"); 
     } 
    IplImage* gray1 = cvCreateImage(cvGetSize(img1), IPL_DEPTH_8U, 1); //contains greyscale  //image 
     CvMemStorage* storage1 = cvCreateMemStorage(0);   //struct for storage 
     cvCvtColor(img1, gray1, CV_BGR2GRAY);    //convert to greyscale 
    cvSmooth(gray1, gray1, CV_GAUSSIAN, 7, 7);    // This is done so as to //prevent a lot of false circles from being detected 
    IplImage* canny1 = cvCreateImage(cvGetSize(gray1),IPL_DEPTH_8U,1); 
     IplImage* rgbcanny1 = cvCreateImage(cvGetSize(gray1),IPL_DEPTH_8U,3); 
     cvCanny(gray1, canny1, 50, 100, 3);     //cvCanny(const //CvArr* image, CvArr* edges(output edge map), double threshold1, double threshold2, int //aperture_size CV_DEFAULT(3)); 

    cvNamedWindow("Canny before hough"); 
    cvShowImage("Canny before hough", canny1); 
     CvSeq* circles1 = cvHoughCircles(gray1, storage1, CV_HOUGH_GRADIENT, 1, gray1->height/3, 250, 100); 
     cvCvtColor(canny1, rgbcanny1, CV_GRAY2BGR); 
    cvNamedWindow("Canny after hough"); 
     cvShowImage("Canny after hough", rgbcanny1); 
     for (size_t i = 0; i < circles1->total; i++) 
     { 
       // round the floats to an int 
       float* p = (float*)cvGetSeqElem(circles1, i); 
       cv::Point center(cvRound(p[0]), cvRound(p[1])); 
       int radius = cvRound(p[2]); 
// draw the circle center 
       cvCircle(rgbcanny1, center, 3, CV_RGB(0,255,0), -1, 8, 0); 
// draw the circle outline 
       cvCircle(rgbcanny1, center, radius+1, CV_RGB(0,0,255), 2, 8, 0); 

       printf("x: %d y: %d r: %d\n",center.x,center.y, radius); 
     } 


////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

    IplImage* img2 = NULL; 
    if ((img2 = cvLoadImage("liberty_wth_obj.jpg"))== 0) 
    { 
printf("cvLoadImage failed\n"); 
    } 
    IplImage* gray2 = cvCreateImage(cvGetSize(img2), IPL_DEPTH_8U, 1); 
    CvMemStorage* storage = cvCreateMemStorage(0); 
    cvCvtColor(img2, gray2, CV_BGR2GRAY); 
    // This is done so as to prevent a lot of false circles from being detected 
    cvSmooth(gray2, gray2, CV_GAUSSIAN, 7, 7); 
    IplImage* canny2 = cvCreateImage(cvGetSize(img2),IPL_DEPTH_8U,1); 
    IplImage* rgbcanny2 = cvCreateImage(cvGetSize(img2),IPL_DEPTH_8U,3); 
    cvCanny(gray2, canny2, 50, 100, 3); 
    CvSeq* circles2 = cvHoughCircles(gray2, storage, CV_HOUGH_GRADIENT, 1, gray2->height/3, 250, 100); 
    cvCvtColor(canny2, rgbcanny2, CV_GRAY2BGR); 
    for (size_t i = 0; i < circles2->total; i++) 
    { 
// round the floats to an int 
      float* p = (float*)cvGetSeqElem(circles2, i); 
      cv::Point center(cvRound(p[0]), cvRound(p[1])); 
      int radius = cvRound(p[2]); 
// draw the circle center 
     cvCircle(rgbcanny2, center, 3, CV_RGB(0,255,0), -1, 8, 0); 
       // draw the circle outline 
      cvCircle(rgbcanny2, center, radius+1, CV_RGB(0,0,255), 2, 8, 0); 
      printf("x: %d y: %d r: %d\n",center.x,center.y, radius); 
    }      
+1

您忘記了添加代碼。 **編輯**的問題添加代碼 – 2013-04-26 11:20:25

+0

哦,是的,我的壞。 – 2013-04-26 11:53:08

回答

1

你想幫助的代碼在這裏?這不是一件容易的事。在互聯網上可用的算法很少,或者你可以嘗試發明新算法。很多研究正在進行中。我對一個過程有一些想法。您可以從YCbCr顏色系統中找到Y的邊緣。從模糊圖片的Y值中扣除此Y值。然後你會得到優勢。現在做一個數組表示。你必須將圖像分塊。現在檢查塊的塊。它可以滑動,旋轉,扭曲等與數組匹配比較。對象跟蹤由於背景而很困難。小心/省略不必要的物體。

+0

代碼幫助或算法,任何...此方法也適用於灰度圖像@ pcbabu? – 2013-04-26 12:02:50

+0

灰度圖像已經給出圖像強度(Y部分)。所以,它也會有幫助。如果你可以實現或找到任何新的算法。我也需要:) – pcbabu 2013-04-26 12:34:26

+0

圖像註冊是否可行? – 2013-04-28 09:37:06

1

我想要走的路可能是背景減法。它可以讓你應對照明條件的變化。

請參閱wikipedia entry的介紹。基本的想法是你必須爲場景背景建立一個模型,然後所有的差異都是相對於背景來計算的。