【20160924】GOCVHelper 图像处理部分(3)

//根据轮廓的圆的特性进行选择

vector<VP> selectShapeCircularity(Mat src,Mat& draw,vector<VP> contours,float minvalue,float maxvalue){

vector<VP> result_contours;

draw = Mat::zeros(src.rows,src.cols,CV_8UC3);

for (int i=0;i<contours.size();i++){

float fcompare = calculateCircularity(contours[i]);

if (fcompare >=minvalue && fcompare <=maxvalue)

result_contours.push_back(contours[i]);

}

for (int i=0;i<result_contours.size();i++){

Scalar  color  = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));

drawContours(draw,result_contours,i,color,-1);

}

return result_contours;

}

vector<VP> selectShapeCircularity(vector<VP> contours,float minvalue,float maxvalue){

vector<VP> result_contours;

for (int i=0;i<contours.size();i++){

float fcompare = calculateCircularity(contours[i]);

if (fcompare >=minvalue && fcompare <=maxvalue)

result_contours.push_back(contours[i]);

}

return result_contours;

}

//计算轮廓的圆的特性

float calculateCircularity(VP contour){

Point2f center;

float radius = 0;

minEnclosingCircle((Mat)contour,center,radius);

//以最小外接圆半径作为数学期望,计算轮廓上各点到圆心距离的标准差

float fsum = 0;

float fcompare = 0;

for (int i=0;i<contour.size();i++){

Point2f ptmp = contour[i];

float fdistenct = sqrt((float)((ptmp.x - center.x)*(ptmp.x - center.x)+(ptmp.y - center.y)*(ptmp.y-center.y)));

float fdiff = abs(fdistenct - radius);

fsum = fsum + fdiff;

}

fcompare = fsum/(float)contour.size();

return fcompare;

}

//返回两点之间的距离

float getDistance(Point2f f1,Point2f f2)

{

return sqrt((float)(f1.x - f2.x)*(f1.x - f2.x) + (f1.y -f2.y)*(f1.y- f2.y));

}

基于Opencv论坛上提供的关于圆的尺度的评判算法,编写Opencv的圆的特性判断算法。主要就是“以最小外接圆半径作为数学期望,计算轮廓上各点到圆心距离的标准差”这个标准差达到一定的范围,则可以认定轮廓是为圆形的。

轮廓处理的两种方法在实际使用的过程中,用途非常广泛。

//投影到x或Y轴上,上波形为vup,下波形为vdown,gap为误差间隔

void projection2(Mat src,vector<int>& vup,vector<int>& vdown,int direction,int gap){

Mat tmp = src.clone();

vector<int> vdate;

if (DIRECTION_X == direction){

for (int i=0;i<tmp.cols;i++){

Mat data = tmp.col(i);

int itmp = countNonZero(data);

vdate.push_back(itmp);

}

}else{

for (int i=0;i<tmp.rows;i++){

Mat data = tmp.row(i);

int itmp = countNonZero(data);

vdate.push_back(itmp);

}

}

//整形,去除长度小于gap的零的空洞

if (vdate.size()<=gap)

return;

for (int i=0;i<vdate.size()-gap;i++){

if (vdate[i]>0 && vdate[i+gap]>0){

for (int j=i;j<i+gap;j++){

vdate[j] = 1;

}

i = i+gap-1;

}

}

//记录上下沿

for (int i=1;i<vdate.size();i++){

if (vdate[i-1] == 0 && vdate[i]>0)

vup.push_back(i);

if (vdate[i-1]>0 && vdate[i] == 0)

vdown.push_back(i);

}

}

投影变换。投影分析是非常重要的分析方式。这里的投影分析是从书上扒下来的,能够直接对图像进行投影分析,效果非常好。当然工具具备了,如何灵活使用也是需要经验的。

来自为知笔记(Wiz)

时间: 2024-10-16 02:54:30

【20160924】GOCVHelper 图像处理部分(3)的相关文章

【20160924】GOCVHelper 图像处理部分(1)

增强后的图像需要通过图像处理获得定量的值.在实际程序设计过程中,轮廓很多时候都是重要的分析变量.参考Halcon的相关函数,我增强了Opencv在这块的相关功能.      //寻找最大的轮廓 VP FindBigestContour(Mat src){ int imax = 0; //代表最大轮廓的序号 int imaxcontour = -1; //代表最大轮廓的大小 std::vector<std::vector<cv::Point>>contours; findContou

【20160924】GOCVHelper 图像处理部分(2)

//根据轮廓的面积大小进行选择 vector<VP>  selectShapeArea(Mat src,Mat& draw,vector<VP> contours,int minvalue,int maxvalue){ vector<VP> result_contours; draw = Mat::zeros(src.rows,src.cols,CV_8UC3); for (int i=0;i<contours.size();i++){ double co

基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的功能增强. 这里将算法库开放源代码,并且编写一系列blog对函数实现进行说明.目的是在于“取之于互联网,用之于互联网”.并且也希望该库能够继续发展下去. 由于算法库基于Opencv和Mfc进行编写,所以要求阅读使用者具备一定基础. 最终提交的是GOCVHelper.h 和GOCVHelper版本号.

【20160924】GOCVHelper综述

GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的功能增强. 这里将算法库开放源代码,并且编写一系列blog对函数实现进行说明.目的是在于“取之于互联网,用之于互联网”.并且也希望该库能够继续发展下去. 由于算法库基于Opencv和Mfc进行编写,所以要求阅读使用者具备一定基础. 最终提交的是GOCVHelper.h 和GOCVHelper版本号.

【20160924】GOCVHelper MFC增强算法(5)

CString ExportListToExcel(CString  sExcelFile,CListCtrl* pList, CString strTitle) { CString warningStr; if (pList->GetItemCount ()>0) { CDatabase database; CString sSql; CString tableName = strTitle; // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*

【20160924】GOCVHelper 图像增强部分(3)

//顶帽去光差,radius为模板半径 Mat moveLightDiff(Mat src,int radius){ Mat dst; Mat srcclone = src.clone(); Mat mask = Mat::zeros(radius*2,radius*2,CV_8U); circle(mask,Point(radius,radius),radius,Scalar(255),-1); //顶帽 erode(srcclone,srcclone,mask); dilate(srcclo

【20160924】GOCVHelper 图像增强部分(1)

图像增强是图像处理的第一步.这里集成了一些实际使用过程中有用的函数. //读取灰度或彩色图片到灰度 Mat imread2gray(string path){ Mat src = imread(path); Mat srcClone = src.clone(); if (CV_8UC3 == srcClone.type() ) cvtColor(srcClone,srcClone,CV_BGR2GRAY); return srcClone; } 算法核心在于判断读入图片的通道数,如果是灰度图片则

【20160924】GOCVHelper 图像增强部分(2)

//填充孔洞 //fillholes Mat fillHoles(Mat src){ Mat dst = getInnerHoles(src); threshold(dst,dst,0,255,THRESH_BINARY_INV); dst = src + dst; return dst; } //获得图像中白色的比率 float getWhiteRate(Mat src){ int iWhiteSum = 0; for (int x =0;x<src.rows;x++){ for (int y

【20160924】GOCVHelper 图像增强部分(5)

// Multiply 正片叠底 void Multiply(Mat& src1, Mat& src2, Mat& dst) { for(int index_row=0; index_row<src1.rows; index_row++) { for(int index_col=0; index_col<src1.cols; index_col++) { for(int index_c=0; index_c<3; index_c++) dst.at<Vec3