我想使用OpenCV检测图像中德国身份证的边界矩形。
这就是我的代码:
capture >> frame;
cv::resize(frame, frame, cv::Size(512,256));
cv::Mat grayScaledFrame, blurredFrame, cannyFrame;
cv::cvtColor(frame, grayScaledFrame, cv::COLOR_BGR2GRAY);
cv::GaussianBlur(grayScaledFrame, blurredFrame, cv::Size(9,9), 1);
cv::Canny(blurredFrame, cannyFrame, 40, 70);
// CONTOURS
std::vector<std::vector<cv::Point>> contours;
cv::findContours(cannyFrame, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// SORT
int maxArea = 0;
std::vector<cv::Point> contour;
for(int i = 0; i < contours.size(); i++) {
int thisArea = cv::contourArea(contours.at(i));
if(thisArea > maxArea) {
maxArea = thisArea;
contour = contours.at(i);
}
}
cv::Rect borderBox = cv::boundingRect(contour);
cv::rectangle(cannyFrame, borderBox, cv::Scalar{255, 32, 32}, 8);
cv::imshow("Webcam", cannyFrame);
结果如下:结果
检测到一些矩形,但不是我感兴趣的大矩形。我已经尝试过Canny的不同阈值,以及高斯模糊的不同内核大小。
向致以最良好的问候
首先,随着环境条件的变化,代码的参数也会发生变化,因此有必要对环境(光照、到对象的距离等(进行标准化。要进行正确的检测,请将卡片放在离相机固定距离的位置,并计算矩形的面积。当卡片与相机相距一定距离时,您可以获得卡片面积的近似参考值。然后,绘制矩形时,使用指定公差范围内的值。