C++ 在图像中寻找差异

C++ 在图像中寻找差异,c++,opencv,image-comparison,C++,Opencv,Image Comparison,我的形象如下: Mat img1 = imread(image_path1, COLOR_BGR2GRAY); Mat img2 = imread(image_path2, COLOR_BGR2GRAY); cv::Mat diffImage; cv::absdiff(img2, img1, diffImage); cv::Mat foregroundMask = cv::Mat::zeros(diffImage.rows, diffImage.cols, CV_8UC3); float

我的形象如下:

Mat img1 = imread(image_path1, COLOR_BGR2GRAY); 
Mat img2 = imread(image_path2, COLOR_BGR2GRAY);

cv::Mat diffImage;
cv::absdiff(img2, img1, diffImage);

cv::Mat foregroundMask = cv::Mat::zeros(diffImage.rows, diffImage.cols, CV_8UC3);

float threshold = 30.0f;
float dist;

for(int j=0; j<diffImage.rows; ++j)
{
    for(int i=0; i<diffImage.cols; ++i)
    {
        cv::Vec3b pix = diffImage.at<cv::Vec3b>(j,i);

        dist = (pix[0]*pix[0] + pix[1]*pix[1] + pix[2]*pix[2]);
        dist = sqrt(dist);

        if(dist>threshold)
        {
            foregroundMask.at<unsigned char>(j,i) = 255;
        }
    }
}

cvtColor(diffImage,diffImage,COLOR_BGR2GRAY);

Mat1b img = diffImage.clone();

// Binarize image
Mat1b bin = img > 70;

// Find non-black points
vector<Point> points;
findNonZero(bin, points);

// Get bounding rect
Rect box = boundingRect(points);

// Draw (in color)
rectangle(img1, box, Scalar(0,255,0), 3);

// Show
imshow("Result", img1);

我想检测5个拨号盘进行处理。Hough圆正在检测所有其他不相关的圆。为了解决这个问题,我创建了一个普通的图像,并与这个图像产生了绝对的差异。它给出了这样的图像:

我在它周围画了一个方框,最后的图像是:

我的代码如下:

Mat img1 = imread(image_path1, COLOR_BGR2GRAY); 
Mat img2 = imread(image_path2, COLOR_BGR2GRAY);

cv::Mat diffImage;
cv::absdiff(img2, img1, diffImage);

cv::Mat foregroundMask = cv::Mat::zeros(diffImage.rows, diffImage.cols, CV_8UC3);

float threshold = 30.0f;
float dist;

for(int j=0; j<diffImage.rows; ++j)
{
    for(int i=0; i<diffImage.cols; ++i)
    {
        cv::Vec3b pix = diffImage.at<cv::Vec3b>(j,i);

        dist = (pix[0]*pix[0] + pix[1]*pix[1] + pix[2]*pix[2]);
        dist = sqrt(dist);

        if(dist>threshold)
        {
            foregroundMask.at<unsigned char>(j,i) = 255;
        }
    }
}

cvtColor(diffImage,diffImage,COLOR_BGR2GRAY);

Mat1b img = diffImage.clone();

// Binarize image
Mat1b bin = img > 70;

// Find non-black points
vector<Point> points;
findNonZero(bin, points);

// Get bounding rect
Rect box = boundingRect(points);

// Draw (in color)
rectangle(img1, box, Scalar(0,255,0), 3);

// Show
imshow("Result", img1);
Mat img1=imread(图像路径1,颜色为灰色);
Mat img2=imread(图像路径2,颜色为灰色);
cv::Mat diffImage;
cv::absdiff(img2、img1、diffImage);
cv::Mat foregroundMask=cv::Mat::Zero(diffImage.rows、diffImage.cols、cv_8UC3);
浮动阈值=30.0f;
浮动距离;
对于(int j=0;j 70;
//查找非黑点
矢量点;
findNonZero(箱子、点);
//获取边界矩形
矩形框=边界矩形(点);
//绘制(彩色)
矩形(img1,长方体,标量(0255,0),3);
//展示
imshow(“结果”,img1);
现在的问题是,我无法将普通图像与任何其他不同大小的图像进行比较。任何指向正确方向的指针都会非常有用

问候,, 萨吉尔·哈特尔

编辑 我的简单形象如下


我想创建一个标准样本普通图像,可以用于任何图像来检测该部分…

基本上我不需要担心,除了图像中的5个刻度盘。我正在进行进一步处理OK,然后尝试任何刚性注册样本代码。在固定图像中,、格子,、保留数字和刻度盘。仅屏蔽板。@main实际平板es是指手??我的意思是,你的注册度量应该只在白板内计算。但不是针对你的普通图像,而是只手移除的普通图像。充其量,你需要通过旋转和缩放来执行注册。除非你手头有一个好的注册算法,否则我建议定制一个广义Hough过程这样它就可以连续检测到五个触碰的圆圈。这应该比搜索单个圆圈更具辨别力。