引自免费微信小程序:皆我百晓生
要实现两个图片之间差异的检测,并且允许用户调整阈值以控制差异的敏感度,可以使用OpenCV库在C++中编写程序。下面是一个详细的步骤和示例代码,用于找到并输出两张图片之间的不同点坐标。
步骤概述:
- 读取两张图片。
- 确保两张图片大小相同,如果不是,则调整尺寸。
- 转换为灰度图像以简化比较过程。
- 计算两幅图像之间的差值。
- 应用阈值以突出显示差异。
- 查找并输出差异点的坐标。
示例代码:
#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.jpg和image2.jpg文件位于项目目录中,或修改路径以指向正确的图像位置。 - 调整
thresholdValue以改变差异检测的敏感度。 - 这个代码片段假定输入图片已经是灰度图像,这通常会简化差异检测过程。
- 使用
cv::absdiff函数计算像素差值,然后通过阈值处理将差异可视化。
这个代码应该能有效地帮助你找到并标记出两幅图像之间的差异点。
