1 dmCornerDetect()二维码的精提取

bool PosGuide::dmCornerDetect(Mat _threshImg, 	//原始图片的矩阵信息
                              vector<Point2f> _rectPoints, //矩阵顶点顺时针排序后的顶点坐标
                              int _sampleDist,	//提取的最靠近图片中心点的矩阵宽度*0.17
                              vector<Point2f>& _dmPoints)
1.1 opencv中的boundingRect()
Rect boundingRect( InputArray points );

将输入的点坐标,通过最小外接矩形,将他们包围,从而形成矩形区域。

举个栗子:

void test_boundingRect()
{
	Mat image = Mat::zeros(240, 320, CV_8UC3);
    
    vector<Point2f> visualRect;
    //随意创建4个点坐标,寻找他们的最小外接矩形
    visualRect.push_back(Point2f(5,5));
    visualRect.push_back(Point2f(60,5));
    visualRect.push_back(Point2f(150,30));
    visualRect.push_back(Point2f(5,105));
    Rect test = boundingRect(visualRect);  //计算出最小外接矩形的左上顶点(x,y)和width, height
    rectangle(image, Point(test.x, test.y), Point(test.width+test.x, test.height+test.y), Scalar(0,255,0), 2);	//画出出矩形
    imshow("origin picture", image);	//画出图来
    waitKey(0);
}

int main()
{
    test_boundingRect();
    return 0;
}

执行结果:

梳理代码笔记(五)
1.2 Mat的构造
Mat secGray(image.size(),CV_8UC1,Scalar::all(0));

创建一个和image一样大小的,8位无符号1通道,颜色为黑色的secGray 矩阵。

rotRects[i].size.width *0.17

为什么要乘0.17,sampledist向内扫描的控制距离。

2 extrLinePoints()

void PosGuide::extrLinePoints(Mat _img, //含有二维码的图片区域
                              Point2i _lstart, //矩阵顶点坐标
                              Point2i _lend,
                              bool _accelerate, 
                              vector<Point2i>& _linePoints)

_accelerate是什么?,是否加速算法,如果sampledist>8即,二维码的信息较多,可以加速处理数据。如果sampledist<8,则认为信息较少,不加速处理数据。8为实验值!!!

if(_sampleDist>8) _accelerate=true;

extrLinePoints()函数时为了提取最小外接矩形四条边上的像素点信息,通过这些像素点信息,拟合出实际的边长所在的直线方程(使用detDMlines()函数)。

为了获得二维码的顶点oxdy的值,通过crossPointofLines()求解出四条直线的交点,然后对应顺序获得oxdy的四个点坐标。

这里的误差有很多,值得优化,提升精度

  1. 求解oxdy的真个过程感觉都很粗糙,

3 ctLocation()

3.1 colorDetect()
void PosGuide::colorDetect(Mat _srcImg, int _colorMode, Mat& _binaryImg)
3.2 HSV颜色空间

Hue------色调

Saturation-------饱和度

Value---------明度

梳理代码笔记(五)
梳理代码笔记(五)
3.3 opencv中的isContinuous()
cv::Mat::isContinuous();  //用来获得Mat矩阵的存储区域是否是连续的,如果连续则返回True;否则返回False。

如果Mat在存储一副图片时,在内存中时连续的,则可以看成一个一维数组,则可以通过成员指针,加快访问Mat图像中的数据,一般剪裁后的Mat就不再连续了,但是可以通过clone()他们,使得剪裁的部分重新连续

相关文章:

  • 2021-05-26
  • 2021-12-25
  • 2021-12-13
  • 2018-01-18
  • 2021-09-20
  • 2021-07-16
  • 2021-11-15
猜你喜欢
  • 2021-07-22
  • 2021-05-24
  • 2022-12-23
  • 2017-12-05
  • 2021-09-04
  • 2021-11-27
  • 2021-11-27
相关资源
相似解决方案