网站模板中文版,如何在WordPress上传主题目录,建材在线,全国不动产登记查询系统contourArea函数的运用。具体例子可以看下面的。《如何获得物体的主要方向#xff1f;》代码略解#xff1a;1、读入图片#xff0c;寻找轮廓#xff1b;//读入图像#xff0c;转换为灰度Mat img imread(e:/sandbox/pca1.jpg);Mat bw;cvtColor(img, bw, COLO…contourArea函数的运用。具体例子可以看下面的。《如何获得物体的主要方向》代码略解1、读入图片寻找轮廓//读入图像转换为灰度Mat img imread(e:/sandbox/pca1.jpg);Mat bw;cvtColor(img, bw, COLOR_BGR2GRAY);//阈值处理threshold(bw, bw, 150, 255, CV_THRESH_BINARY);//寻找轮廓vector contours;vector hierarchy;findContours(bw, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);2、首先以大小筛选轮廓//轮廓分析找到工件for (size_t i 0; i contours.size(); i){//计算轮廓大小double area contourArea(contours[i]);//去除过小或者过大的轮廓区域(科学计数法表示)if (area 1e2 || 1e5 area) continue;//绘制轮廓drawContours(img, contours, i, CV_RGB(255, 0, 0), 2, 8, hierarchy, 0);//寻找每一个轮廓的方向getOrientation(contours[i], img);}3、单独处理每个轮廓分析其主要方向绘制结果//获得构建的主要方向double getOrientation(vector pts, Mat img){//构建pca数据。这里做的是将轮廓点的x和y作为两个维压到data_pts中去。Mat data_pts Mat(pts.size(), 2, CV_64FC1);//使用mat来保存数据也是为了后面pca处理需要for (int i 0; i data_pts.rows; i){data_pts.at(i, 0) pts[i].x;data_pts.at(i, 1) pts[i].y;}//执行PCA分析PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW);//获得最主要分量在本例中对应的就是轮廓中点也是图像中点Point pos Point(pca_analysis.mean.at(0, 0),pca_analysis.mean.at(0, 1));//存储特征向量和特征值vector eigen_vecs(2);vector eigen_val(2);for (int i 0; i 2; i){eigen_vecs[i] Point2d(pca_analysis.eigenvectors.at(i, 0),pca_analysis.eigenvectors.at(i, 1));eigen_val[i] pca_analysis.eigenvalues.at(i,0);//注意这个地方原代码写错了}//在轮廓/图像中点绘制小圆circle(img, pos, 3, CV_RGB(255, 0, 255), 2);//计算出直线在主要方向上绘制直线line(img, pos, pos 0.02 * Point(eigen_vecs[0].x * eigen_val[0], eigen_vecs[0].y * eigen_val[0]) , CV_RGB(255, 255, 0));line(img, pos, pos 0.02 * Point(eigen_vecs[1].x * eigen_val[1], eigen_vecs[1].y * eigen_val[1]) , CV_RGB(0, 255, 255));//返回角度结果return atan2(eigen_vecs[0].y, eigen_vecs[0].x);}