步骤如下:

1.图片灰化;

2.中值滤波 去噪

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

4.除法去光影

5.阈值操作

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

主要分两种连通区域和findContours

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

这是findContours的效果

下面是连通区域的结果

#include

#include

#include

#include

#include

#include

#include

#include

#include

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(i,CC_STAT_AREA);

putText(output,ss.str(), centroids.at(i),FONT_HERSHEY_SIMPLEX,0.4,Scalar(255,255,255));

}

imshow("Result", output);

}

void FindContoursBasic(Mat img) {

vector> 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、特征点匹配

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

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

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

双向匹配加距离约束。

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

#include "stdafx.h"

#include

#include

#include

#include

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<: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 <:l2>>matcher;//匹配器

std::vector <: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 连通区域检测_浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)...相关推荐

  1. python sys模块作用_浅谈Python中的模块

    模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...

  2. python读取图像数据流_浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片 ...

  3. python np array归一化_浅谈利用numpy对矩阵进行归一化处理的方法

    浅谈利用numpy对矩阵进行归一化处理的方法 本文不讲归一化原理,只介绍实现(事实上看了代码就会懂原理),代码如下: def Normalize(data): m = np.mean(data) mx ...

  4. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

  5. python 共享内存变量_浅谈python多进程共享变量Value的使用tips

    前言: 在使用tornado的多进程时,需要多个进程共享一个状态变量,于是考虑使用multiprocessing.Value(对于该变量的具体细节请查阅相关资料).在根据网上资料使用Value时,由于 ...

  6. python中怎么计数_浅谈python中统计计数的几种方法和Counter详解

    1) 使用字典dict() 循环遍历出一个可迭代对象中的元素,如果字典没有该元素,那么就让该元素作为字典的键,并将该键赋值为1,如果存在就将该元素对应的值加1. lists = ['a','a','b ...

  7. python数据类型转换原因_浅谈Python数据类型之间的转换

    Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 compl ...

  8. python采用函数编程模式_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  9. python打开方式错误_浅谈python 调用open()打开文件时路径出错的原因

    昨晚搞鼓了一下python的open()打开文件 代码如下 def main(): infile =open("C:\Users\Spirit\Desktop\bc.txt",'r ...

  10. python计算现场得分_浅谈用 Python 计算文本 BLEU 分数

    浅谈用 Python 计算文本 BLEU 分数 BLEU, 全称为 Bilingual Evaluation Understudy(双语评估替换), 是一个比较候选文本翻译与其他一个或多个参考翻译的评 ...

最新文章

  1. 结构体和typedef
  2. 独角兽也未能幸免,2019“阵亡”新经济公司大盘点
  3. python 语言教程(3)变量之数字类型
  4. 海量数据处理专题(六)——双层桶划分
  5. 4. linux调用文件计算阶乘前5项和_【题解循环】1091:求阶乘的和
  6. 66.为什么有时候在ISE软件中,顶层文件不能置顶?
  7. hdu5414(2015多校10)--CRB and String(字符串匹配)
  8. Cocos2d-x 3.0 开发(七)在程序中处理cocoStudio导出动画
  9. hive3.1.2的下载及安装
  10. 6-15 基于顺序表的直接选择排序 (10分)
  11. 7-49 打印学生选课清单 (25 分)
  12. 数据仓库-事实表和维度表的设计
  13. 正确区分LJMP、AJMP、SJMP、JMP跳转指令
  14. 四川大学 计算机复试分数线,2015年四川大学考研复试分数线已公布
  15. MOS电平转换电路 stm32的I2C电平转换电路 IIC电平转换电路
  16. 这个男人用8幅画刻画“父爱”,被暖化了
  17. 七代处理器装win7_7代cpu能装win7旗舰版吗?七代处理器 不能装win7的解决方法
  18. C语言_链式栈结构+二进制计算器
  19. 自然语言处理之汉字转拼音---Pypinyin工具
  20. 孪生素数的最优解(应该)

热门文章

  1. Java判断一个实体类对象实例的所有成员变量是否为空
  2. 《MicoPython入门指南》一书即将出版
  3. 诺基亚成功转型:引领新一代5G技术 布局物联网
  4. CUDA入门(六) 异步并行执行解析
  5. spring --(16)AOP前置通知与后置通知
  6. JVM 基础知识(GC)
  7. Linux软件包安装之yum的使用
  8. 【iphone】 如何将app发布到appstore中
  9. 布易般的旅途(一) 像流水一般的生活
  10. MapXtreme2004的Web选择控件(三)