一个公司可以备案两个网站,网络营销推广方法包括有哪些?,太平洋手机网,网络运营商怎么看霍夫变换 首先是笛卡尔坐标系到霍夫空间的转换#xff0c;比如笛卡尔坐标系中有一条直线 yaxb。 笛卡尔坐标系中一条直线#xff0c;对应霍夫空间的一个点。 反过来同样成立#xff08;霍夫空间的一条直线#xff0c;对应笛卡尔坐标系的一个点#xff09; 原理其实很简单 …霍夫变换 首先是笛卡尔坐标系到霍夫空间的转换比如笛卡尔坐标系中有一条直线 yaxb。 笛卡尔坐标系中一条直线对应霍夫空间的一个点。 反过来同样成立霍夫空间的一条直线对应笛卡尔坐标系的一个点 原理其实很简单 比如 1笛卡尔坐标系内yaxb 一条直线确定时 它的斜率和截距是确定的 即是a b是确定的因此到了霍夫空间内就对应一个a,b 即是笛卡尔中一条直线对应霍夫空间一个点 2笛卡尔坐标系内一个点 比如x1,y1 相当于x1 y1是确定的 在霍夫空间中 b-xay 即是 b-x1ay1 代表的是一条直线 即是笛卡尔中一个点对应霍夫空间一条直线 3笛卡尔坐标系多个点 这些点如果共线 就相当于回到了1 笛卡尔坐标系中一条直线对应霍夫空间一个点 4笛卡尔坐标系多个点 不共线 5但是 如果直线斜率不存在的时候 霍夫空间那就不容易表示 因此我们换成极坐标 一样的转换原理 先求极坐标方程 其中参数从斜率a和截距b变成 极径p和极角θ 比如下面的变换对比 具体计算过程举例 OpenCV C实现 
/*
*参数说明
*src:待检测的原图像
*rho:以像素为单位的距离分辨率即距离r离散时的单位长度
*theat:以角度为单位的距离分辨率即角度Θ离散时的单位长度取值的步长
*Threshold:累加器阈值参数空间中离散化后每个方格被通过的累计次数大于该阈值则该方格代表的直线被视为在原图像中存在
*lines:检测到的直线极坐标描述的系数数组每条直线由两个参数表示分别为直线到原点的距离r和原点到直线的垂线与x轴的夹角
*/
void myHoughLines(Mat src, double rho, double theat, int Threshold, vectorVec2f lines)
{if (src.empty() || rho  0.1 || theat360 || theat  0)return;int row  src.rows;int col  src.cols;Mat gray;if (src.channels()  1){cvtColor(src, gray, COLOR_BGR2GRAY);}elsesrc.copyTo(gray);int maxDistance  sqrt(src.cols * src.cols  src.rows * src.rows); // 图像任意两点最大距离int houghMat_cols  360 / theat;        // theat是角度取值的步长  霍夫变换后距离夹角坐标下对应的Mat的宽一共多少个θint houghMat_rows  maxDistance / rho;  // 霍夫坐标距离夹角下对应的Mat的高 就是p的取值个数 Mat houghMat  Mat::zeros(houghMat_rows, houghMat_cols, CV_32FC1); // 存储p和 θ的矩阵//边缘检测Canny(gray, gray, 100, 200, 3);//二值化threshold(gray, gray, 160, 255, THRESH_BINARY);//遍历二值化后的图像for (int i  0; i  row; i){for (int j  0; j  col; j){if (gray.ptruchar(i)[j] ! 0){/*从0到360度遍历角度得到一组关于距离夹角的离散点即得到一组关于经过当前点(ij)按单位角度theat旋转得到的直线*/for (int k  0; k  360 / theat; k  theat){// k * CV_PI / 180   是极角 θ double r  i * sin(k * CV_PI / 180)  j * cos(k * CV_PI / 180);// 找哪个(θ,r)  最多 if (r  0){   // 直线到原点的距离必须大于0 获得在霍夫变换距离夹角坐标系下对应的Mat的行的下标int r_subscript  r / rho;// 经过该直线的点数加1houghMat.atfloat(r_subscript, k)  houghMat.atfloat(r_subscript, k)  1;}}}}}/*现在 houghMat 矩阵里面的数值N  是经过这点的线个数极坐标下比如说 行列对应 p, θ  对应的值就是 经过p, θ的线一共N条经过直线的点数N 大于阈值 则视为在原图中存在该直线  就要这条直线了 */for (int i  0; i  houghMat_rows; i){for (int j  0; j  houghMat_cols; j){if (houghMat.ptrfloat(i)[j]  Threshold){// line保存直线到原点的距离和直线到坐标原点的垂线和x轴的夹角 求p和θVec2f line(i * rho, j * theat * CV_PI / 180);lines.push_back(line);}}}}