1寻找轮廓
//创建轮廓
vector vecHierarchy;
vector> vecContours;
//寻找外轮廓
findContours(matSrc, vecContours, vecHierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE ,Point(0, 0));
if( vecContours.empty() == 0 || vecHierarchy.empty() == 0 )
{
return FALSE;
}
2寻找轮廓的外切矩形
RotatedRect box = minAreaRect(vecContours[1]);
Point2f Point[4];
box.points(Point);
3.轮廓填充
CV_FILLED为全部填充,如果需要填充某一个轮廓填写那个轮廓的id。
drawContours(matSrc, vecContours , 0, Scalar(255), CV_FILLED);
4.Canny检测图像边缘
经典的Canny边缘检测算法通常都是从高斯模糊开始,到基于双阈值实现边缘连接结束。但是在实际工程应用中,考虑到输入图像都是彩色图像,最终边缘连接之后的图像要二值化输出显示,所以完整的Canny边缘检测算法实现步骤如下:1. 彩色图像转换为灰度图像2. 对图像进行高斯模糊3. 计算图像梯度,根据梯度计算图像边缘幅值与角度4. 非最大信号压制处理(边缘细化)5. 双阈值边缘连接处理6. 二值化图像输出结果
Canny(matSrc ,matDes ,125, 350);
5.灰度直方图均衡化
equalizeHist(MatSrc, MatSrc);
6. 垂直投影
void VerticalProjection(const Mat& src, Mat& dst)
{
// accept only char type matrices
CV_Assert(src.depth() != sizeof(uchar));
dst.create(1, src.cols, CV_32F);
int i, j;
const uchar* p;
float* p_dst = dst.ptr(0);
for(j = 0; j < src.cols; j++){
p_dst[j] = 0;
for(i = 0; i < src.rows; i++){
p = src.ptr(i);
p_dst[j] += p[j];
}
}
}
7. 水平投影
void HorizonProjection(const Mat& src, Mat& dst)
{
// accept only char type matrices
CV_Assert(src.depth() != sizeof(uchar));
dst.create(src.rows, 1, CV_32F);
int i, j;
const uchar* p;
float* p_dst;
for(i = 0; i < src.rows; i++){
p = src.ptr(i);
p_dst = dst.ptr(i);
p_dst[0] = 0;
for(j = 0; j < src.cols; j++){
p_dst[0] += p[j];
}
}
}
8.hough变换检测圆
vector circles;
HoughCircles(matSrc, circles, CV_HOUGH_GRADIENT,
1, //累加器的分辨率(图像的尺寸/2)
6, //两个圆之间的最小距离
100, //Canny高阈值
5, //最小投票数
3,
7); //极小极大半径3 10
vector::const_iterator itc = circles.begin();
while(itc != circles.end())
{
...
i++;
}
9. 调节对比度和亮度
dContrast为对比度参数,范围为10-100,iBright为亮度参数范围为0-255。
matTmp.convertTo( matSrc, -1, dContrast, iBright);
10.画矩形
Point1,Point2为矩形对角的2个点。
rectangle(matSrc, Point1, Point2, Scalar( 0, 0, 0), CV_FILLED, 0);
11.画直线
Point1,Point2为直线上的2个点。
line( matSrc , Point1 , Point2 , Scalar( 0, 0, 0) );
12.画圆或者点
circle( matSrc, Point, 2, Scalar(255,0,0,0), CV_FILLED, CV_AA, 0);