首先用形态学去膨胀整图,使二维码成为一个黑块,定位出这个正方形即获得二维码大致位置。
二维码的三个角都有2个嵌套关系的矩形,以下根据轮廓嵌套关系去定位这3个点:
Mat imgSrc=imread("qrcode.jpg");
if(imgSrc.empty())
{
cout<<"Load image error!!!"<<endl;
return -1;
}
Mat imgGray,imgBin;
cvtColor(imgSrc,imgGray,COLOR_BGR2GRAY);
threshold(imgGray,imgBin,0,255,THRESH_BINARY_INV | THRESH_OTSU);
vector<vector<Point>> contours,contours2;
vector<Vec4i> hierarchy;
findContours(imgBin.clone(),contours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_NONE);
size_t nSize=contours.size();
int c=0,ic=0,area=0;
int parentIdx=-1;
for(size_t i=0;i<nSize;i++)
{
if (hierarchy[i][2] != -1) //有子轮廓
{
if(ic==0) //TREE结构时,第一个父轮廓是最外层轮廓
parentIdx = i;
ic++;
}
else if(hierarchy[i][2] == -1)//无子轮廓
{
ic = 0;
parentIdx =