虽然找到2张图片之间的差异,但OpenCV差异大于预期 [英] While finding a difference between 2 pictures OpenCV difference is bigger than it is supposed to be

查看:480
本文介绍了虽然找到2张图片之间的差异,但OpenCV差异大于预期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用OpenCV(在Android NDK中),我遇到了问题。我想找到两张图片之间的差异,而不是削减差异。但是,以下输出使差异更大。我使用了这个问题中的图像
第二张图片

结果



另一方面,这段代码给了我这样的输出

  Mat& backgroundImage = *(Mat *)addrRgba; 
Mat& currentImage = *(Mat *)addrRgba2;
Mat diffImage;

absdiff(backgroundImage,currentImage,diffImage);
Mat灰色;

cvtColor(diffImage,grey,COLOR_BGR2GRAY);

equalizeHist(灰色,灰色);
Mat mask = currentImage.clone();
cvtColor(mask,mask,COLOR_BGR2GRAY);
浮动阈值= 30.0f;
float dist;

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

if(pix == Vec3b(0,0,0)){

点中心(i,j);
circle(mask,center,1,Scalar(255,255,255), - 1,9,0);
}
}
Mat maskedImage;
diffImage.copyTo(maskedImage,mask);
currentImage = mask;


ps:抱歉没有设计

解决方案

我是在@Silencer的帮助下这样做的,因为我得到了正确的结果。希望如果有人遇到类似问题,这将有所帮助

  Mat& backgroundImage = *(Mat *)addrRgba; 
Mat& currentImage = *(Mat *)addrRgba2;
Mat HSV_currentImage;
Mat HSVbackgroundImagebg;
Mat diffImage;
cvtColor(backgroundImage,HSVbackgroundImagebg,CV_BGR2HSV);
cvtColor(currentImage,HSV_currentImage,CV_BGR2HSV);
absdiff(HSVbackgroundImagebg,HSV_currentImage,diffImage);
Mat mask(diffImage.size(),CV_8UC1);
浮动阈值= 30.0f;
float dist;

for(int j = 0; j< diffImage.rows; ++ j)
for(int i = 0; i< diffImage.cols; ++ i)
{
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){
mask.at< unsigned char>(j,i)= 255;
}

}

Mat res;
bitwise_and(currentImage,currentImage,res,mask);
currentImage = res;


I'm working with OpenCV (in Android NDK) and I have a problem. I want to find differences between two pictures, and than cut the difference. However, following output made difference bigger. I used images from this question CV - Extract differences between two images . And I tried to solve it but unsuccessfully. Here is the output

Mat& backgroundImage = *(Mat*) addrRgba;
Mat& currentImage = *(Mat*) addrRgba2;
Mat diffImage;
absdiff(backgroundImage, currentImage, diffImage);
Mat mask=currentImage.clone();

          float threshold = 30.0f;
            float dist;

          for(int j=0; j<diffImage.rows; ++j)
              for(int i=0; i<diffImage.cols; ++i)
              {
                  if(diffImage.at<cv::Vec3b>(j,i)==Vec3b(0,0,0)){
                    Point center( i , j);
                   circle (mask,center,1,Scalar( 255, 255, 255 ),-1,9,0);
                  }

              }

               currentImage=mask;

FIRST IMAGE SECOND IMAGE RESULT

On the other hand , this code gives me output like this

Mat& backgroundImage = *(Mat*) addrRgba;
Mat& currentImage = *(Mat*) addrRgba2;
Mat diffImage;

      absdiff(backgroundImage, currentImage, diffImage);
      Mat gray;

      cvtColor(diffImage,gray, COLOR_BGR2GRAY);

      equalizeHist( gray, gray );
      Mat mask=currentImage.clone();
      cvtColor(mask,mask, COLOR_BGR2GRAY);
      float threshold = 30.0f;
      float dist;

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

                        if(pix==Vec3b(0,0,0)){

                              Point center( i , j);
                              circle (mask,center,1,Scalar( 255, 255, 255 ),-1,9,0);
                        }
                    }
                    Mat maskedImage;
                diffImage.copyTo(maskedImage,mask);
               currentImage=mask;

ps:sorry for no design

解决方案

I did it like this with a help of @Silencer as a concequence I got the right result. Hope this will help if anyone have a similar problem

      Mat& backgroundImage = *(Mat*) addrRgba;
      Mat& currentImage = *(Mat*) addrRgba2;
      Mat HSV_currentImage;
      Mat HSVbackgroundImagebg;
      Mat diffImage;
      cvtColor(backgroundImage, HSVbackgroundImagebg, CV_BGR2HSV);
      cvtColor(currentImage, HSV_currentImage, CV_BGR2HSV);
      absdiff(HSVbackgroundImagebg, HSV_currentImage, diffImage);
      Mat mask(diffImage.size(), CV_8UC1);
                float threshold = 30.0f;
                float dist;

                for(int j=0; j<diffImage.rows; ++j)
                    for(int i=0; i<diffImage.cols; ++i)
                    {
                        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){
                          mask.at<unsigned char>(j,i) = 255;
                        }

                    }

      Mat res;
      bitwise_and(currentImage, currentImage, res, mask);
      currentImage=res;

这篇关于虽然找到2张图片之间的差异,但OpenCV差异大于预期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆