OpenCV C++ 检测图片局部花屏方法
要实现检测图片是否有局部花屏,可以使用以下步骤:
- 读取图片并转换为灰度图像。
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::medianBlur(grayImg, filteredImg, 5);
- 对滤波后的图像进行边缘检测,可以使用 Canny 算子或 Laplacian 算子。
cv::Mat edgesImg;
cv::Canny(filteredImg, edgesImg, 50, 150);
// 或者
cv::Mat laplacianImg;
cv::Laplacian(filteredImg, laplacianImg, CV_8U, 3, 1, 0);
- 对边缘图像进行形态学操作,可以使用膨胀或腐蚀。
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);
- 统计二值化后的图像中白色像素点的数量,如果数量超过一定阈值,则判断为有局部花屏。
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;
}
原文地址: https://www.cveoy.top/t/topic/odYB 著作权归作者所有。请勿转载和采集!