浅谈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网络编程之读取网站根目录实例
Sep 30 Python
python实现查询苹果手机维修进度
Mar 16 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
Jan 20 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
Jan 05 Python
python使用response.read()接收json数据的实例
Dec 19 Python
Django框架中间件(Middleware)用法实例分析
May 24 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
python实现FTP循环上传文件
Mar 20 Python
Python selenium如何打包静态网页并下载
Aug 12 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
Python何绘制带有背景色块的折线图
Apr 23 Python
python解析照片拍摄时间进行图片整理
Jul 23 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
PHP设计聊天室步步通
2006/10/09 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
javascript中的this详解
2014/12/08 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
JavaScript交换变量常用4种方法解析
2020/09/02 Javascript
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
Python Json模块中dumps、loads、dump、load函数介绍
2018/05/15 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
Python实现登陆文件验证方法
2018/10/06 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
Python OpenCV中的resize()函数的使用
2019/06/20 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
python使用Geany编辑器配置方法
2020/02/21 Python
python使用pandas抽样训练数据中某个类别实例
2020/02/28 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
Pandas的数据过滤实现
2021/01/15 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
公务员年总结的自我评价
2013/10/25 职场文书
金融管理专业求职信
2014/07/10 职场文书
债务授权委托书范本
2014/10/17 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python