2016-10-10 10:01:54 freedom098 阅读数 14188
  • ShaderGraph从入门到实战

    大智和你一起学习ShaderGraph,在实战中探索。 课程内容 ShaderGraph的基本使用 丰富的实战案例: · 全息效果 · 边缘光效果 ·  溶解效果 · 积雪效果 · 扭曲效果 · 干扰效果 · 流光效果 · 石化效果 · 顶点动画:跳动的小球 · 游动的龙鱼 · 小草摇曳效果 · 海面效果 ·  水晶效果 · 裂缝的冰面效果 · 自定义节点的用法及改造裂缝的冰块 · 云海效果 · 雨滴涟漪效果 · 卡通渲染 所需前置知识 安装好Unity即可

    1058 人正在学习 去看看 郑洪智

师弟最近要使用四旋翼进行桥梁探伤,主要是用运动相机搭载在四轴上检测裂缝,就顺便搞了一下有关于裂缝检测的图像处理。

算法比较简单,没有考虑太多复杂情况,在简单墙面背景下基本可以找到裂缝并框定。

基本思路为,先转换彩色图为灰度图,然后进行自适应局部阈值化,目的是为了减少光照与阴影对阈值的影响,然后进行膨胀操作,尽量放大凸显裂缝,在用中值滤波平滑一下,去除一些高频噪声。然后调用寻找轮廓函数寻找所有轮廓,寻找连通域最大的那个轮廓,然后在原图画框即可。

先上算法代码,之后还有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 ;
    if(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;    
    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;
	//system("pause");

	waitKey();

	return 0;
}



2018-08-03 17:25:09 FunnyWhiteCat 阅读数 8899
  • ShaderGraph从入门到实战

    大智和你一起学习ShaderGraph,在实战中探索。 课程内容 ShaderGraph的基本使用 丰富的实战案例: · 全息效果 · 边缘光效果 ·  溶解效果 · 积雪效果 · 扭曲效果 · 干扰效果 · 流光效果 · 石化效果 · 顶点动画:跳动的小球 · 游动的龙鱼 · 小草摇曳效果 · 海面效果 ·  水晶效果 · 裂缝的冰面效果 · 自定义节点的用法及改造裂缝的冰块 · 云海效果 · 雨滴涟漪效果 · 卡通渲染 所需前置知识 安装好Unity即可

    1058 人正在学习 去看看 郑洪智

使用OpenCV检测桥墩表面照片中的裂缝,并测量裂缝的长度和宽度,这是我的毕业设计中最核心的部分。学习OpenCV如何使用并不难,找到正确的处理流程才是关键。所以在此记录、分享一下思路和代码。

处理流程如下:

  1. 图像灰度化
  2. 增加对比度
  3. Canny边缘检测
  4. 用形态学连接临近裂缝
  5. 找出所有连通域,删除非裂缝噪点区域
  6. 对每个连通域提取骨架,测量长度和宽度

代码托管在码云上,详见这里

另外,包含了裂缝处理功能的桌面应用同样托管在码云上,详见这里

下面是处理效果:

源图像
检测裂缝
检测裂缝
滤波后
滤波后
提取骨架和测量
提取骨架和测量
重叠结果
重叠结果

待优化的地方还有许多,尤其是测量。不过大体效果还可以,继续改进吧。

 

 

2019-12-18 21:14:48 T_I_A_N_ 阅读数 151
  • ShaderGraph从入门到实战

    大智和你一起学习ShaderGraph,在实战中探索。 课程内容 ShaderGraph的基本使用 丰富的实战案例: · 全息效果 · 边缘光效果 ·  溶解效果 · 积雪效果 · 扭曲效果 · 干扰效果 · 流光效果 · 石化效果 · 顶点动画:跳动的小球 · 游动的龙鱼 · 小草摇曳效果 · 海面效果 ·  水晶效果 · 裂缝的冰面效果 · 自定义节点的用法及改造裂缝的冰块 · 云海效果 · 雨滴涟漪效果 · 卡通渲染 所需前置知识 安装好Unity即可

    1058 人正在学习 去看看 郑洪智

闲来无事,做的一个小东西。效果图:

 既然能检测裂缝,那是不是……本来想开个车,奈何代码有bug,又不想改,就算了吧

 代码如下:

srcImg=imread('3.jpg');    %图片读取 
subplot(3,4,1);
imshow(srcImg);   
title('原始图像');

srcImg=rgb2gray(srcImg);   %灰度图
subplot(3,4,2);
imshow(srcImg);  


cropImg = imcrop(srcImg);     %裁剪图片
title('灰度图');
subplot(3,4,3);
imshow(cropImg);
title('裁剪图像');

adjImg=imadjust(cropImg,[0.40,0.75],[0,1]);   %区域增强
subplot(3,4,4);
imshow(adjImg);
title('区域增强');


H = fspecial('gaussian',2,2);          %滤波去噪
filImg = imfilter(adjImg,H,'replicate');
subplot(3,4,5);
imshow(filImg);
title('滤波去噪');


bwImgBig=im2bw(filImg,70/255);         %对灰度图像进行两次不同大小阈值的二值化,再把两次产生的二值化图像进行而至重构。
subplot(3,4,6);
imshow(~bwImgBig);
title('大阈值');

bwImgSmall=im2bw(filImg,30/255);
subplot(3,4,7);
imshow(~bwImgSmall);
title('小阈值');



recImg=imreconstruct(~bwImgSmall,~bwImgBig);   %去除图像边框干扰
[m,n]=size(recImg);
recImg(1,1:n)=0;
recImg(m,1:n)=0;
recImg(1:m,1)=0;
recImg(1:m,n)=0;
subplot(3,4,8);
imshow(recImg);
title('去除图像边框干扰');



%去除小于10的区域
recImg=bwareaopen(recImg,10);   %Bwareaopen函数是去除像素点少于十的连通区域
subplot(3,4,9);
imshow(recImg);
title('去除小于10的区域' );

%mark
[r,c]=size(recImg);
mark1=21;
col1=recImg(mark1,:);
col1=find(col1==1);
col1=round(length(col1)/2)+col1(1);

subplot(3,4,10);
imshow(recImg);
hold on; 
plot(col1,mark1, 'o','MarkerSize',20,'MarkerEdgeColor','r'); 

mark2=round(r/2);
col2=recImg(mark2,:);
col2=find(col2==1);
col2=round(length(col2)/2)+col2(1);
plot(col2,mark2, 'o','MarkerSize',20,'MarkerEdgeColor','r'); 


mark3=r-20;
col3=recImg(mark3,:);
col3=find(col3==1);
col3=round(length(col3)/2)+col3(1);
plot(col3,mark3, 'o','MarkerSize',20,'MarkerEdgeColor','r'); 


%计算宽度
[r,c]=size(recImg);
num=length(find(recImg==1));
avgPixel=num/m;
%普通对话框
h=dialog('name','宽度(pixel)','position',[700 500 200 70]);
uicontrol('parent',h,'style','text','string',avgPixel,'position',[10 40 120 20],'fontsize',12);
uicontrol('parent',h,'style','pushbutton','position',[80 10 50 20],'string','确定','callback','delete(gcbf)');

 

没有更多推荐了,返回首页