• 两个图片找出不同 可以调整阈值


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 qhdre 2024-06-12 17:48 采纳率: 0% 浏览 3 首页/ 编程语言 / 两个图片找出不同 可以调整阈值 c++计算机视觉 两张图片检测不同点并输出不通点坐标,可以设置阈值,有多大的区别进行过滤显示输出 opencv C++的代码 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-12 17:48
      关注

      引自免费微信小程序:皆我百晓生

      要实现两个图片之间差异的检测,并且允许用户调整阈值以控制差异的敏感度,可以使用OpenCV库在C++中编写程序。下面是一个详细的步骤和示例代码,用于找到并输出两张图片之间的不同点坐标。

      步骤概述:

      1. 读取两张图片。
      2. 确保两张图片大小相同,如果不是,则调整尺寸。
      3. 转换为灰度图像以简化比较过程。
      4. 计算两幅图像之间的差值。
      5. 应用阈值以突出显示差异。
      6. 查找并输出差异点的坐标。

      示例代码:

      #include 
      #include 
      
      int main(int argc, char** argv)
      {
          // 读取两张图片
          cv::Mat img1 = cv::imread("image1.jpg", cv::IMREAD_GRAYSCALE);
          cv::Mat img2 = cv::imread("image2.jpg", cv::IMREAD_GRAYSCALE);
      
          // 检查图片是否正确加载
          if (img1.empty() || img2.empty())
          {
              std::cout << "Error: Could not open or find the images!" << std::endl;
              return -1;
          }
      
          // 确保两张图片大小相同
          if (img1.size() != img2.size())
          {
              cv::resize(img2, img2, img1.size());
          }
      
          // 创建一个与原图大小相同的矩阵,用于存储差值图像
          cv::Mat diff;
          cv::absdiff(img1, img2, diff);
      
          // 将差异图像转换为8位图像
          cv::Mat diff_8u;
          diff.convertTo(diff_8u, CV_8U);
      
          // 设置阈值参数
          double thresholdValue = 30; // 用户可调的阈值
      
          // 应用阈值处理
          cv::Mat thresholded;
          cv::threshold(diff_8u, thresholded, thresholdValue, 255, cv::THRESH_BINARY);
      
          // 查找并打印所有差异点坐标
          std::vector points;
          for (int i = 0; i < thresholded.rows; ++i)
          {
              for (int j = 0; j < thresholded.cols; ++j)
              {
                  if (thresholded.at(i, j) > 0)
                  {
                      points.push_back(cv::Point(j, i));
                  }
              }
          }
      
          // 输出差异点坐标
          for (const auto& point : points)
          {
              std::cout << "Difference at (" << point.x << ", " << point.y << ")" << std::endl;
          }
      
          // 显示结果
          cv::imshow("Image 1", img1);
          cv::imshow("Image 2", img2);
          cv::imshow("Differences", thresholded);
          cv::waitKey(0);
      
          return 0;
      }
      

      注意事项:

      • 确保image1.jpgimage2.jpg文件位于项目目录中,或修改路径以指向正确的图像位置。
      • 调整thresholdValue以改变差异检测的敏感度。
      • 这个代码片段假定输入图片已经是灰度图像,这通常会简化差异检测过程。
      • 使用cv::absdiff函数计算像素差值,然后通过阈值处理将差异可视化。

      这个代码应该能有效地帮助你找到并标记出两幅图像之间的差异点。

      展开全部

      评论 编辑记录
    • 阿里嘎多学长 2024-06-12 17:48
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      在C++环境下使用OpenCV库来比较两张图片并找出它们之间的不同点,可以通过以下步骤实现:

      1. 读取两张图片。
      2. 将两张图片转换为灰度图,以简化处理过程。
      3. 对两张图片进行差分操作,找出差异。
      4. 应用阈值化,以过滤掉小于设定阈值的差异。
      5. 寻找差异区域的轮廓,并输出不同点的坐标。

      以下是一个简单的C++代码示例,使用OpenCV库来实现上述功能:

      #include 
      #include 
      
      using namespace cv;
      using namespace std;
      
      int main() {
          // 读取两张图片
          Mat image1 = imread("image1.jpg", IMREAD_GRAYSCALE);
          Mat image2 = imread("image2.jpg", IMREAD_GRAYSCALE);
      
          if (image1.empty() || image2.empty()) {
              cerr << "Could not open or find the image" << endl;
              return -1;
          }
      
          // 计算两张图片的差异
          Mat diff;
          absdiff(image1, image2, diff);
      
          // 应用阈值化,过滤掉小于阈值的差异
          Mat thresh;
          double threshold = 50.0; // 阈值可以根据需要进行调整
          threshold(diff, thresh, threshold, 255, THRESH_BINARY);
      
          // 寻找差异区域的轮廓
          vector> contours;
          findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
      
          // 输出不同点的坐标
          for (size_t i = 0; i < contours.size(); i++) {
              for (size_t j = 0; j < contours[i].size(); j++) {
                  cout << "Difference point: (" << contours[i][j].x << ", " << contours[i][j].y << ")" << endl;
              }
          }
      
          return 0;
      }
      

      请注意,上述代码示例中的阈值设置为50.0,您可以根据实际需要调整这个值。

      关于参考资料,以下是一些有用的链接:

      1. Arthur Wang - Otsu 阈值法:介绍了Otsu阈值法的基本原理,虽然这是Python的实现,但对理解阈值化很有帮助。
      2. CSDN博客 - OpenCV图片差异检测与标注:提供了Python代码示例,演示如何使用OpenCV进行图片差异检测和标注差异区域。
      3. CSDN博客 - OpenCV中的图像阈值化操作详解:详细介绍了OpenCV中的图像阈值化操作,包括代码实现。
      4. 博客园 - 使用 OpenCV Python 检测和可视化两个图像之间的差异:虽然使用的是Python,但提供了比较两个图像差异的步骤和代码示例。
      5. Cnblogs - OpenCV 入门教程:提供了OpenCV入门教程,包括阈值处理的相关内容。
      6. OpenCV 官方文档 - 直方图对比:介绍了直方图对比的概念和方法,虽然与直接比较两张图片的差异不同,但提供了另一种分析图像差异的思路。

      展开全部

      评论 编辑记录
    • 关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      以下是使用OpenCV C++实现两个图像找出不同点并输出不同点坐标的代码示例:

      #include 
      #include 
      #include 
      
      using namespace std;
      using namespace cv;
      
      void findDifferentPoints(Mat& img1, Mat& img2, vector& diffPoints, int threshold) {
          diffPoints.clear();
      
          // 确保两个图像的尺寸一致
          if (img1.size() != img2.size()) {
              cerr << "Error: Images have different sizes." << endl;
              return;
          }
      
          // 遍历所有像素点
          for (int y = 0; y < img1.rows; y++) {
              for (int x = 0; x < img1.cols; x++) {
                  // 计算两个图像在该像素点的差异
                  Scalar diff = abs(img1.at(y, x) - img2.at(y, x));
      
                  // 如果差异超过阈值,则认为是不同点
                  if (diff[0] > threshold) {
                      diffPoints.push_back(Point(x, y));
                  }
              }
          }
      }
      
      int main() {
          // 读取两个图像
          Mat img1 = imread("image1.jpg", 0);  // 转为灰度图像
          Mat img2 = imread("image2.jpg", 0);  // 转为灰度图像
      
          if (img1.empty() || img2.empty()) {
              cerr << "Error: Failed to read image files." << endl;
              return -1;
          }
      
          // 设置阈值
          int threshold = 50;
      
          // 找出不同点
          vector diffPoints;
          findDifferentPoints(img1, img2, diffPoints, threshold);
      
          // 输出不同点的坐标
          cout << "Different points coordinates:" << endl;
          for (const auto& point : diffPoints) {
              cout << "(" << point.x << ", " << point.y << ")" << endl;
          }
      
          // 在图像上可视化不同点
          Mat diffImg = img1.clone();
          for (const auto& point : diffPoints) {
              diffImg.at(point.y, point.x) = 255;  // 设置为白色
          }
      
          // 显示图像
          namedWindow("Different Points", WINDOW_NORMAL);
          imshow("Different Points", diffImg);
          waitKey(0);
      
          return 0;
      }
      

      请注意,这是一个基本的示例代码。准确性可能因图像的内容和阈值的选择而有所不同。你可以根据实际需求和图像特征进行调整。

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    【Unity3D】使用 FBX 格式的外部模型 ② ( FBX 模型与默认 3D 模型的区别 | FBX 模型贴图查找路径 | FBX 模型可设置多个材质 )
    基于JSP动漫论坛的设计与实现
    Mysql常见日志作用
    GPU cuda cuDNN pytorch理解
    【LeetCode-中等题】150. 逆波兰表达式求值
    延时任务-基于redis zset的完整实现
    在Visual Studio Code中使用pytest进行AWS Lambda函数测试的最佳实践
    class的get和set
    WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式
    特斯拉Dojo超算:AI训练平台的自动驾驶与通用人工智能之关键
  • 原文地址:https://ask.csdn.net/questions/8117655