要实现检测图片是否有局部花屏,可以使用以下步骤:

  1. 读取图片并转换为灰度图像。
cv::Mat img = cv::imread('image.jpg');
cv::Mat grayImg;
cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY);
  1. 对灰度图像进行滤波操作,可以使用高斯滤波或中值滤波。
cv::Mat filteredImg;
cv::GaussianBlur(grayImg, filteredImg, cv::Size(5, 5), 0);
// 或者
cv::medianBlur(grayImg, filteredImg, 5);
  1. 对滤波后的图像进行边缘检测,可以使用 Canny 算子或 Laplacian 算子。
cv::Mat edgesImg;
cv::Canny(filteredImg, edgesImg, 50, 150);
// 或者
cv::Mat laplacianImg;
cv::Laplacian(filteredImg, laplacianImg, CV_8U, 3, 1, 0);
  1. 对边缘图像进行形态学操作,可以使用膨胀或腐蚀。
cv::Mat dilatedImg;
cv::dilate(edgesImg, dilatedImg, cv::Mat(), cv::Point(-1, -1), 3);
// 或者
cv::Mat erodedImg;
cv::erode(laplacianImg, erodedImg, cv::Mat(), cv::Point(-1, -1), 3);
  1. 统计二值化后的图像中白色像素点的数量,如果数量超过一定阈值,则判断为有局部花屏。
int threshold = 1000;
int whiteCount = cv::countNonZero(dilatedImg); // 或者 cv::countNonZero(erodedImg);
if (whiteCount > threshold) {
    // 有局部花屏
} else {
    // 没有局部花屏
}

完整代码如下:

cv::Mat img = cv::imread('image.jpg');
cv::Mat grayImg;
cv::cvtColor(img, grayImg, cv::COLOR_BGR2GRAY);

cv::Mat filteredImg;
cv::GaussianBlur(grayImg, filteredImg, cv::Size(5, 5), 0);

cv::Mat edgesImg;
cv::Canny(filteredImg, edgesImg, 50, 150);

cv::Mat dilatedImg;
cv::dilate(edgesImg, dilatedImg, cv::Mat(), cv::Point(-1, -1), 3);

int threshold = 1000;
int whiteCount = cv::countNonZero(dilatedImg);
if (whiteCount > threshold) {
    std::cout << "There is partial screen problem." << std::endl;
} else {
    std::cout << "There is no partial screen problem." << std::endl;
}
OpenCV C++ 检测图片局部花屏方法

原文地址: https://www.cveoy.top/t/topic/odYB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录