整理學習opencv過程中寫的demo
滑塊解鎖思路
- 兩張圖片淘邻、一張帶缺口的原圖 一張只有缺口的滑塊
- 有些服務端會直接返回base64驗證碼圖片
- 一般生成的缺口滑塊高度與原圖一致茵典,需要解開x點位置
上代碼
int identify_gap(string captcha_path, String sliding_path) {
Mat captcha = imread(captcha_path);
if (captcha.empty()) {
}
Mat sliding = imread(sliding_path);
if (sliding.empty()) {
}
Mat captcha_gray, captcha_binary, sliding_gray, sliding_binary;
//轉成灰度 降低噪聲
cvtColor(captcha, captcha_gray, COLOR_BGR2GRAY);
cvtColor(sliding, sliding_gray, COLOR_BGR2GRAY);
//找輪廓
cv::Canny(captcha_gray, captcha_binary, 100, 200);
cv::Canny(sliding_gray, sliding_binary, 100, 200);
//判斷如果模板比原圖高, 剪裁
//因為我找的圖片滑塊比原圖高 所以特殊處理剪裁了一下, 如果高度一致敬尺,跳過此步
if (captcha_binary.rows < sliding_binary.rows) {
Rect rect(0, 0, sliding_binary.cols, captcha_binary.rows);
sliding_binary = sliding_binary(rect);
}
//匹配
cv::Mat image_matched;
matchTemplate(captcha_binary, sliding_binary, image_matched, cv::TM_CCOEFF_NORMED);
double minVal, maxVal;
cv::Point minLoc, maxLoc;
//尋找最佳匹配位置
cv::minMaxLoc(image_matched, &minVal, &maxVal, &minLoc, &maxLoc);
cout << " minVal: " << minVal
<< " maxVal" << maxVal
<< " minLoc" << minLoc
<< " maxLoc" << maxLoc << endl;
return maxLoc.x;
}
效果
隨便找個滑塊解鎖圖片試試吧