浅谈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中atexit模块的基本使用示例
Jul 08 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
Django 路由系统URLconf的使用
Oct 11 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
Python设计模式之原型模式实例详解
Jan 18 Python
python实现弹跳小球
May 13 Python
解决python执行不输出系统命令弹框的问题
Jun 24 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
python怎么判断模块安装完成
Jun 19 Python
python实现简易名片管理系统
Apr 11 Python
Python+Appium实现自动抢微信红包
May 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
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
jquery实现的简单二级菜单效果代码
2015/09/22 Javascript
jQuery+css实现的换页标签栏效果
2016/01/27 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
js作用域和作用域链及预解析
2019/04/11 Javascript
理解Python中函数的参数
2015/04/27 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
python中几种自动微分库解析
2019/08/29 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
Pytorch之parameters的使用
2019/12/31 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
remote接口和home接口主要作用
2013/05/15 面试题
农民工工资承诺书范文
2014/03/31 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
新生入学欢迎词
2015/01/26 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
七年级作文之我的梦想
2019/10/16 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
MySQL学习之基础命令实操总结
2022/03/19 MySQL