选择轮廓(select_shape)

简介: 选择轮廓(select_shape)          Halcon是一款运用广泛的图像识别和处理软件。在肤浅的接触中,它的轮廓选择算子(select_shape)给予我很深的印象。结果是往往几行代码就能够产生很好的效果:       比如要得到这样的结果        只需要 ...
选择轮廓(select_shape)
    
    Halcon是一款运用广泛的图像识别和处理软件。在肤浅的接触中,它的轮廓选择算子(select_shape)给予我很深的印象。结果是往往几行代码就能够产生很好的效果:
      比如要得到这样的结果
       只需要
read_image (Image1, 'F:/未来项目/钢管识别/FindTube/FindTube/1.jpg')
rgb1_to_gray (Image1, GrayImage)
threshold (GrayImage, Regions, 43, 111)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 666)
select_shape (SelectedRegions, SelectedRegions1, 'circularity', 'and', 0. 45, 1)
      当然Halcon是在背后做了许多工作的。
      几行代码中,比较重要的是算子就是"select_shape"。这个算子的参数很多,我也就比较熟悉这两种。
      如果我想在Opencv中也要这样的结果,就需要自己动手尝试实现。实现过程中我采用了类似的函数名表示敬意。
// selectshape.cpp : 选择轮廓
// by: jsxyhelu(1755311380)
# include  "stdafx.h"
# include  <iostream >
# include  "opencv2/core/core.hpp"
# include  "opencv2/highgui/highgui.hpp"
# include  "opencv2/imgproc/imgproc.hpp"
using  namespace std;
using  namespace cv;
# define  VP  vector <Point >   //用VP符号代替 vector<point>
RNG  rng( 12345    );
//带有上下限的threshold
void threshold2(Mat gray,Mat & thresh, int minvalue, int maxvalue)
{
    Mat thresh1;
    Mat thresh2;
    threshold(gray,thresh1, 43, 255, THRESH_BINARY);
    threshold(gray,thresh2, 111, 255,THRESH_BINARY_INV);
    thresh  = thresh1  & thresh2;
}
//寻找并绘制出联通区域
vector <VP > connection2(Mat src,Mat & draw)
{    
    draw  = Mat : :zeros(src.rows,src.cols,CV_8UC3);
    vector <VP >contours;    
    findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
     for ( int i = 0;i <contours.size();i ++)
    {
        Scalar  color   = Scalar(rng.uniform( 0, 255),rng.uniform( 0, 255),rng.uniform( 0, 255));
        drawContours(draw,contours,i,color, - 1);
    }
     return contours;
}
//select_shape
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 ++)
    { 
         int countour_area  = contourArea(contours[i]);
         if (countour_area  >minvalue  && countour_area <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;
}
//计算轮廓的圆的特性
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;
}
//select_shape
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;
}
int _tmain( int argc, _TCHAR * argv[])
{    
    Mat src;
    Mat gray;
    Mat thresh;
    Mat draw_connection;
    Mat draw_area;
    Mat draw_circle;
    vector <VP >contours_connection;    
    vector <VP >contours_area;
    vector <VP >contours_circle;
    vector <VP >contours_tmp;
     //read_image (Image1, 'F:/未来项目/钢管识别/FindTube/FindTube/1.jpg')
    src  = imread( "1.jpg");
     //rgb1_to_gray (Image1, GrayImage)
    cvtColor(src,gray,COLOR_BGR2GRAY);
     //threshold (GrayImage, Regions, 43, 111)
    threshold2(gray,thresh, 43, 111);
     //connection (Regions, ConnectedRegions)
    contours_connection  = connection2(thresh.clone(),draw_connection);
     //select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 666)
    contours_area  = selectShapeArea(thresh.clone(),draw_area,contours_connection, 150, 666);
     //select_shape (SelectedRegions, SelectedRegions1, 'circularity', 'and', 0.45, 1)
    contours_circle  = selectShapeCircularity(thresh.clone(),draw_circle,contours_area, 1, 6);
     //显示结果
    imshow( "src",src);
    imshow( "thresh",thresh);
    imshow( "draw_connection",draw_connection);
    imshow( "draw_area",draw_area);
    imshow( "draw_circle",draw_circle);
    waitKey();
}
结果如下,这段代码中还有一个问题,就是计算轮廓圆的性质的方法,我这里采用的是自己想出来的方法,似乎不是很完善,需要进一步找到资料才修正。
 
       
 
 





目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com
目录
相关文章
|
5月前
|
计算机视觉
使用hist()函数绘制直方图
【6月更文挑战第7天】使用hist()函数绘制直方图。
41 1
|
6月前
|
计算机视觉
用hist()函数绘制直方图
用hist()函数绘制直方图。
25 1
|
6月前
|
计算机视觉 Python
opencv cv::Range()和cv::Rect()用于crop来获得感兴趣区域
opencv cv::Range()和cv::Rect()用于crop来获得感兴趣区域
232 0
|
传感器 网络协议 机器人
【UR3+RealSense手眼标定(eye-in-hand)】
【UR3+RealSense手眼标定(eye-in-hand)】
1138 0
Circles Inside a Square(几何题)
题目描述 You have 8 circles of equal size and you want to pack them inside a square. You want to minimize the size of the square. The following figure illustrates the minimum way of packing 8 circles inside a square:
127 0
Circles Inside a Square(几何题)
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
769 0
halcon模板匹配实践(2)算子find_shape_model里的参数Row, Column, Angle含义是什么?
|
算法
Halcon拟合系列(2)直线/圆/椭圆/矩形拟合算子fit_line_contour_xld/fit_circle_contour_xld/...
Halcon拟合系列(2)直线/圆/椭圆/矩形拟合算子fit_line_contour_xld/fit_circle_contour_xld/...
2238 0
|
计算机视觉 Python
CV:cv2实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型
CV:cv2实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型
CV:cv2实现检测几何形状并进行识别、输出周长、面积、颜色、形状类型
Halcon之select_shape_xld是支持多个参数过滤的
Halcon之select_shape_xld是支持多个参数过滤的
677 0
|
C#
C# 绘制Word形状——基本形状、组合形状
一、序言 在Office Word中,支持在Word文档中插入类型非常丰富的形状,包括线条、矩形、基本形状(诸如圆形、多边形、星形、括号、笑脸等等图形)、箭头形状、公式形状、流程图、旗帜图形、标注图形等等,我们在编程过程中,想要在Word中绘制不同类型的图形,可以通过类库来操作。
1408 0