Completely Automated Public Turing test to tell Computers and Humans Apart
看到这一长串英文,会不会很懵,它的意思是全自动区分计算机和人类的图灵测试。就是我们熟知的验证码。在日常的学习生活中,或多或少的接触过这样那样的验证码图片。
今天,让我们一起来探讨一下如何用OPENCV生成这些验证码图片。
观察一个验证码图片,它由三个部分组成: 背景色块,随机字符,干扰线条。
1、增加背景色块
int imageWidth = 300;
int imageHeight = 60;
srand((unsigned)time(NULL));
double bgColor = rand() % 100 + 100;
Mat image(imageHeight,imageWidth,CV_8UC3, Scalar(bgColor, bgColor, bgColor));
imshow("image1", image);
for (int i = 0; i < image.rows; i++) { //多色显示
for (int j = 0; j < image.cols; j++)
{
image.at<Vec3b>(i, j)[0] = rand() % 100 + 100;
image.at<Vec3b>(i, j)[1] = rand() % 100 + 100;
image.at<Vec3b>(i, j)[2] = rand() % 100 + 100;
}
}
2、获得随机字符
string getLetterCode() {
string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
vector <bool>flag = {0};
flag.resize(36);
vector<char> result;
result.resize(6);
srand((unsigned)time(NULL));
for (int i = 0; i < result.size(); i++) {
int j = rand() % 36;;
while (flag[j]) j = rand()%36;
result[i] = chars[j];
flag[j] = true;
}
string string = "";
for (int i = 0; i < result.size(); i++) {
string += result[i];
}
return string;
}
3、给字符增加随机颜色,随