浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)


Posted in Python onJune 04, 2020

步骤如下:

1.图片灰化;

2.中值滤波 去噪

3.求图片的光影(自动光学检测)

4.除法去光影

5.阈值操作

6.实现了三种目标检测方法

主要分两种连通区域和findContours

过程遇到了错误主要是图片忘了灰化处理,随机颜色的问题。下面代码都已经进行了解决

这是findContours的效果

浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)

下面是连通区域的结果

浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)

#include <opencv2\core\utility.hpp>

#include <opencv2\imgproc.hpp>
#include <opencv2\highgui.hpp>
#include<opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\core\matx.hpp>
#include<string>
#include <iostream>
#include <limits>
using namespace std;
using namespace cv;
Mat img = imread("C:\\Users\\hasee\\Desktop\\luosi.jpg",0);
Mat removeLight(Mat imge, Mat pattern, int method);
Mat calculateLightPattern(Mat img);
static Scalar randomColor(RNG& rng);

void ConnectedComponents(Mat img);
void ConnectedComponetsStats(Mat img);
void FindContoursBasic(Mat img);
void main()
{
Mat img_noise;
medianBlur(img,img_noise,3);
Mat pattern = calculateLightPattern(img_noise);

Mat re_light = removeLight(img_noise, pattern, 1);

Mat img_thr;
threshold(re_light,img_thr,30,255,THRESH_BINARY);

//ConnectedComponents(img_thr);
ConnectedComponetsStats(img_thr);
//FindContoursBasic(img_thr);
waitKey(0);

}
Mat removeLight(Mat imge, Mat pattern, int method) {
Mat aux;
if (method == 1) {
Mat img32, pattern32;
imge.convertTo(img32, CV_32F);
pattern.convertTo(pattern32, CV_32F);
aux = 1 - (img32 / pattern32);
aux = aux * 255;
aux.convertTo(aux, CV_8U);
}
else {
aux = pattern - imge;
}
return aux;
}

Mat calculateLightPattern(Mat img) {
Mat pattern;
blur(img, pattern, Size(img.cols / 3, img.cols / 3));
return pattern;
}
static Scalar randomColor(RNG& rng)
{
int icolor = (unsigned)rng;
return Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255);
}
void ConnectedComponents(Mat img) {
Mat lables;
int num_objects = connectedComponents(img, lables);

if (num_objects < 2) {
cout << "未检测到目标" << endl;
return;
}
else {
cout << "检测到的目标数量: " << num_objects - 1 << endl;
}
Mat output = Mat::zeros(img.rows,img.cols,CV_8UC3);
RNG rng(0xFFFFFFFF);

for (int i = 1; i < num_objects;i++) {
Mat mask = lables == i;
output.setTo(randomColor(rng),mask);
}
imshow("Result",output);
}

void ConnectedComponetsStats(Mat img) {
Mat labels, stats, centroids;
int num_objects = connectedComponentsWithStats(img,labels,stats,centroids);
if (num_objects<2) {
cout << "未检测到目标" << endl;
return;
}
else {
cout << "检测到的目标数量: " << num_objects - 1 << endl;
}
Mat output = Mat::zeros(img.rows, img.cols, CV_8UC3);
RNG rng(0xFFFFFFFF);
for (int i = 1; i < num_objects; i++) {
Mat mask = labels == i;
output.setTo(randomColor(rng), mask);
stringstream ss;
ss << "area: " << stats.at<int>(i,CC_STAT_AREA);
putText(output,ss.str(), centroids.at<Point2d>(i),FONT_HERSHEY_SIMPLEX,0.4,Scalar(255,255,255));
}
imshow("Result", output);
}

void FindContoursBasic(Mat img) {
vector<vector<Point>> contours;
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
Mat output = Mat::zeros(img.rows, img.cols, CV_8UC3);
if (contours.size()==0) {
cout << "未检测到对象" << endl;
return;
}else{
cout << "检测到对象数量: " << contours.size() << endl;
}
RNG rng(0xFFFFFFFF);
for (int i = 0; i < contours.size(); i++)
drawContours(output,contours,i,randomColor(rng));
imshow("Result", output);
}

补充知识:SURF特征点检测与匹配之误匹配点删除

SURF特征点检测与匹配之误匹配点删除

SURF(SpeededUp Robust Feature)是加速版的具有鲁棒性的算法,是SIFT算法的加速版。

但是SURF特征匹配之后有大量的误匹配点,需要对这些误匹配点进行删除。

这里不从理论上讲解SURF原理等,直接说用法。

特征匹配的步骤分为三步:

1、找出特征点

2、描述特征点

3、特征点匹配

具体基本代码见最后。具体的可以看毛星云的书籍,但是个人认为其编程风格不严谨,自己有做改动。

但是匹配出来的结果如下:

浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)

有很多的误匹配点,如何对误匹配点进行删除呢。

双向匹配加距离约束。

实验结果如下:效果还是非常好的。

浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)

#include "stdafx.h" 
#include <opencv2\opencv.hpp> 
#include <opencv2\nonfree\nonfree.hpp> 
#include <opencv2\legacy\legacy.hpp> 
 
#include <iostream> 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
 //读取图片 
 cv::Mat srcImg1 = cv::imread("1.jpg", 1); 
 cv::Mat srcImg2 = cv::imread("2.jpg", 1); 
 if (srcImg1.empty() || srcImg2.empty()) 
 { 
  std::cout << "Read Image ERROR!" << std::endl; 
  return 0; 
 } 
 //SURF算子特征点检测 
 int minHessian = 700; 
 cv::SurfFeatureDetector detector(minHessian);//定义特征点类对象 
 std::vector<cv::KeyPoint> keyPoint1, keyPoint2;//存放动态数组,也就是特征点 
 
 detector.detect(srcImg1, keyPoint1); 
 detector.detect(srcImg2, keyPoint2); 
 
 //特征向量 
 cv::SurfDescriptorExtractor extrator;//定义描述类对象 
 cv::Mat descriptor1, descriptor2;//描述对象 
 
 extrator.compute(srcImg1, keyPoint1, descriptor1); 
 extrator.compute(srcImg2, keyPoint2, descriptor2); 
 
 //BruteForce暴力匹配 
 cv::BruteForceMatcher <cv::L2<float>>matcher;//匹配器 
 std::vector <cv::DMatch> matches; 
 matcher12.match(descriptor1, descriptor2, matches); 
 
 //绘制关键点 
 cv::Mat imgMatch; 
 cv::drawMatches(srcImg1, keyPoint1, srcImg2, keyPoint2, matches, imgMatch); 
 
 cv::namedWindow("匹配图", CV_WINDOW_AUTOSIZE); 
 cv::imshow("匹配图", imgMatch); 
 cv::imwrite("匹配图.jpg", imgMatch); 
 cv::waitKey(10); 
 return 0; 
}

以上这篇浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现统计单词出现的个数
May 28 Python
Python实现的密码强度检测器示例
Aug 23 Python
python3操作微信itchat实现发送图片
Feb 24 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
django用户登录验证的完整示例代码
Jul 21 Python
简单了解python shutil模块原理及使用方法
Apr 28 Python
python中sort sorted reverse reversed函数的区别说明
May 11 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
Python requests接口测试实现代码
Sep 08 Python
selenium如何定位span元素的实现
Jan 13 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
Python数据分析之pandas函数详解
Apr 21 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 #Python
Python简单实现词云图代码及步骤解析
Jun 04 #Python
Python坐标轴操作及设置代码实例
Jun 04 #Python
Python flask框架实现查询数据库并显示数据
Jun 04 #Python
使用opencv中匹配点对的坐标提取方式
Jun 04 #Python
Python实现计算图像RGB均值方式
Jun 04 #Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
Jun 04 #Python
You might like
水质对咖图啡风味的影响具体有哪些
2021/03/03 冲泡冲煮
php实现的MySQL通用查询程序
2007/03/11 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
php文件上传类完整实例
2016/05/14 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
使用pandas读取文件的实现
2019/07/31 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python实现复制文件到指定目录
2019/10/16 Python
pandas 对group进行聚合的例子
2019/12/27 Python
迎八一活动主题
2014/01/31 职场文书
给孩子的新年寄语
2014/04/08 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
超市工作总结范文2014
2014/12/19 职场文书
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL