选择轮廓(select_shape)
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)
// 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();
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
压板识别项目分析
压板识别项目 零、相关说明: 首先进行一下相关说明。在“jsxyhelu.cnblogs.com/项目实战派”栏目里面出现的需求、图片和其他资源,都是我在浏览威客网站、论坛等网站的时候通过正规渠道获得的真实需求。个人觉得比较感兴趣,但是由于时间或者工作的冲突自己没有去接这些项目。但是由于这些需求都很有实现价值,所以过了一段时间,仍然拿出来练一练手,并且实现了核心模块。希望能够给浏览者一些启发。如果你认为这些图片和资源放在这里不合适,请及时联系我(1755311380@qq.com),我会及时处理的。此外,我会将核心代码和技术细节尽可能将清楚,我认为这样才是最有价值的方式。如果需要原始代码,也可以和我联系。 一、原始需求/图片: 1.图片为保护压板正常方式投入,要求图像识别能正确判断,并将保护压板投退状态显示出来。 2.保护压板漏投(误投),要求图像识别能发现报警,并显示出是哪些保护压板漏投。 3.保护压板有投退异常现象,要求图像识别能发现报警,并显示出是哪些保护压板异常。 4.通过保护盘二维码(或条形码),要能识别出来保护盘柜名称 (正常情况下的图片) (存在问题的图片1) (存...
- 下一篇
钢管识别项目2
钢管识别项目2 零、相关说明: 首先进行一下相关说明。在“jsxyhelu.cnblogs.com/项目实战派”栏目里面出现的需求、图片和其他资源,都是我在浏览威客网站、论坛等网站的时候通过正规渠道获得的真实需求。个人觉得比较感兴趣,但是由于时间或者工作的冲突自己没有去接这些项目。但是由于这些需求都很有实现价值,所以过了一段时间,仍然拿出来练一练手,并且实现了核心模块。希望能够给浏览者一些启发。如果你认为这些图片和资源放在这里不合适,请及时联系我(1755311380@qq.com),我会及时处理的。此外,我会将核心代码和技术细节尽可能将清楚,我认为这样才是最有价值的方式。如果需要原始代码,也可以和我联系。 一、需求 将“钢管识别项目1”中识别出来的结果导入Csharp的GUI中,通过手工辅助操作,对识别的结果进行修正。 二、初步分析 现在已经实现了图像处理的相关算法,能够自动处理图像得到上图的结果,那么下面需要做的就是 2.1)传递结果到Csharp中去; 采用的方法是比较熟悉的"csharp调用dll文件"方法。麻烦之处在于这里的结果数量比较大,而且其大小...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Linux系统CentOS6、CentOS7手动修改IP地址
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作