opencv进⾏简单的裂缝检测
版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。 blog.csdn/freedom098/article/details/52774911
师弟最近要使⽤四旋翼进⾏桥梁探伤,主要是⽤运动相机搭载在四轴上检测裂缝,就顺便搞了⼀下有关于裂缝检测的图像处理。
算法⽐较简单,没有考虑太多复杂情况,在简单墙⾯背景下基本可以到裂缝并框定。
基本思路为,先转换彩⾊图为灰度图,然后进⾏⾃适应局部阈值化,⽬的是为了减少光照与阴影对阈值的影响,然后进⾏膨胀操作,尽量放⼤凸显裂缝,在⽤中值滤波平滑⼀下,去除⼀些⾼频噪声。然后调⽤寻轮廓函数寻所有轮廓,寻连通域最⼤的那个轮廓,然后在原图画框即可。
先上算法代码,之后还有Qt界⾯加图像传输完整版。
// cracker_find.cpp : 定义控制台应⽤程序的⼊⼝点。
//
#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <vector>
#include<time.h>
using namespace cv;
using namespace std;
void location(Mat &srcImg,Mat &binImg)
{
vector< vector<Point> > contours ;
rectangle函数opencvif(binImg.data)
{
findContours(binImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
}
if(contours.size() > 1)
{
double maxArea = 0;
vector <Point> maxContour;
for(size_t i = 0; i < contours.size(); i++)
{
double area = contourArea(contours[i]);
if (area > maxArea)
{
maxArea = area;
maxContour = contours[i];
}
}
Rect maxRect;
Mat ROI;
if (maxContour.size()!=0)
{
maxRect = boundingRect(maxContour);
}
rectangle(srcImg, maxRect, cv::Scalar(0,0,255));
}
}
void preProcessing(Mat &srcImg,Mat &binImg,int elementSize = 7)
{
Mat grayImg;
cvtColor(srcImg,grayImg,CV_RGB2GRAY);
int blockSize = 25;
int constValue = 35;
int constValue = 35;
adaptiveThreshold(grayImg, binImg, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue); //threshold(grayImg,binImg,150,255,THRESH_BINARY_INV);
Mat element = getStructuringElement(MORPH_RECT, Size(elementSize, elementSize));
dilate(binImg,binImg,element);
medianBlur(binImg,binImg,9);
}
int _tmain(int argc, _TCHAR* argv[])
{
clock_t start,finish;
double totaltime;
start=clock();
Mat srcImg = imread("D:\\crack.jpg");
Mat binImg;
preProcessing(srcImg,binImg);
imshow("binImg",binImg);
location(srcImg,binImg);
imshow("ansImg",srcImg);
finish=clock();
totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
cout<<"\n此程序的运⾏时间为"<<totaltime<<"秒!"<<endl;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论