浅谈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 相关文章推荐
详解Python3.1版本带来的核心变化
Apr 07 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
在Python中使用第三方模块的教程
Apr 27 Python
python中 logging的使用详解
Oct 25 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
python直接获取API传递回来的参数方法
Dec 17 Python
django最快程序开发流程详解
Jul 19 Python
python模拟实现分发扑克牌
Apr 22 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 Python
AI:如何训练机器学习的模型
Apr 16 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
Yii的CDbCriteria查询条件用法实例
2014/12/04 PHP
ThinkPHP中使用ajax接收json数据的方法
2014/12/18 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
30个最佳jQuery Lightbox效果插件分享
2011/04/11 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
判断滚动条到底部的JS代码
2013/11/04 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
js array数组对象操作方法汇总
2019/03/18 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
2019/08/09 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
python如何写出表白程序
2020/06/01 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
个人求职信范文分享
2013/12/13 职场文书
自行车广告词大全
2014/03/21 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
单位个人查摆问题及整改措施
2014/10/28 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
工作简报怎么写
2015/07/21 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书