浅谈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实现的批量下载RFC文档
Mar 10 Python
python实现模拟按键,自动翻页看u17漫画
Mar 17 Python
Python中使用第三方库xlrd来读取Excel示例
Apr 05 Python
python实现telnet客户端的方法
Apr 15 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Python cookie的保存与读取、SSL讲解
Feb 17 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
python unichr函数知识点总结
Dec 16 Python
解决pytorch 数据类型报错的问题
Mar 03 Python
只用20行Python代码实现屏幕录制功能
Jun 02 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
关于文本留言本的分页代码
2006/10/09 PHP
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
使用vue-aplayer插件时出现的问题的解决
2018/03/02 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
浅谈Python 对象内存占用
2016/07/15 Python
Python实现图片转字符画的示例
2017/08/22 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
python超时重新请求解决方案
2019/10/21 Python
python绘制无向图度分布曲线示例
2019/11/22 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
基于python实现地址和经纬度转换
2020/05/19 Python
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
公务员培训自我鉴定
2014/02/01 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
2014年体育教师工作总结
2014/12/03 职场文书
运动会开幕词
2015/01/28 职场文书
2015年服务员工作总结
2015/04/08 职场文书
2015年维修工作总结
2015/04/25 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
反邪教观后感
2015/06/11 职场文书
Python学习之os包使用教程详解
2022/03/21 Python