1

为了安全起见,我想找到 hwo 以获得 diff b/w 2 个类似的灰度图像,以便在系统中实现。我想检查它们之间是否发生了任何差异。对于对象跟踪,我在下面的程序中实现了精明检测。我很容易得到结构化对象的轮廓.. 后来减去 cn 以仅给出增量图像中差异的轮廓....但是如果第二张图像中存在非结构性差异(例如烟雾或火)怎么办?我增加了对比度以获得更清晰的边缘检测,并修改了 canny fn 参数中的阈值 vals..但没有得到合适的结果。

canny edge 也可以检测阴影边缘。如果我的两张相似的图像是在一天中的不同时间拍摄的,阴影会有所不同,因此边缘会有所不同,并且会产生不良的误报

我应该如何解决这个问题?任何人都可以帮忙吗?谢谢!enter code here在 Visual Studio 2010 的 opencv 2.4 中使用 c 语言 api

#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);
    }                       
4

3 回答 3

1

您需要代码帮助吗?这不是一件容易的事。互联网上可用的算法很少,或者您可以尝试发明新的算法。很多研究都在这方面进行。我对一个过程有一些想法。Y您可以通过YCbCr颜色系统找到边缘。Y从模糊图像的值中减去该Y值。然后,您将获得优势。现在制作一个数组表示。您必须将图像分成块。现在用块检查块。它可能会滑动、旋转、扭曲等。与阵列匹配进行比较。由于背景,对象跟踪很困难。小心小心/忽略不必要的物品。

于 2013-04-26T11:27:28.293 回答
1

我认为要走的路可能是背景减法。它可以让您应对照明条件的变化。

有关介绍,请参阅维基百科条目。基本思想是您必须为场景背景建立一个模型,然后相对于背景计算所有差异。

于 2013-11-20T09:57:37.927 回答
0

我已经对图像差异进行了一些分析,但代码是为 java 编写的。请查看以下可能会有所帮助的链接

如何找到两个图像之间的差异矩形

干杯!

于 2013-11-21T09:19:26.577 回答