opencv 图像阴影检测
参数说明:
IplImage *workImg-当前全局变量,表示正在显示的图片。
downleft, upright- 检测出的阴影部分矩形框的两个对角顶点。
/*********************************************/
//阴影检测
/*********************************************/ CvPoint downleft,upright;
int cnt;
int dir[][]={-,-,-,,-,,,,,-,,,,,,-};
#define SHADOW 170
#define Thres_KindNumber 20 bool InRange(CvPoint point,IplImage* pi)
{
int w=pi->width;
int h=pi->height;
if(point.x>=&&point.x<w&&point.y>=&&point.y<h)
{
float v[];
for(i=;i<;i++)
{
v[i]=((uchar*)(pi->imageData + pi->widthStep*point.y))[point.x*+i];
if(v[i]<=SHADOW)
return true;
}
}
return false;
} void Dye(IplImage** curimg,CvPoint s)
{
int i;
queue<CvPoint>Q;
Q.push(s); for(i=;i<;i++)
((uchar*)((*curimg)->imageData + (*curimg)->widthStep*s.y))[s.x*+i]=SHADOW+; while(!Q.empty())
{
s=Q.front();
Q.pop(); if(s.x<downleft.x) downleft.x=s.x;
if(s.y<downleft.y) downleft.y=s.y;
if(s.x>upright.x) upright.x=s.x;
if(s.y>upright.y) upright.y=s.y; //dye around
for(i=;i<;i++)
{
CvPoint now=cvPoint(s.x+dir[i][],s.y+dir[i][]);
if(InRange(now,*curimg))
{
Q.push(now);
cnt++;
for(i=;i<;i++)
((uchar*)((*curimg)->imageData + (*curimg)->widthStep*now.y))[now.x*+i]=SHADOW+;
}
}
}
} void CCVMFCView::OnShadowDetect()
{
//detect shadows,find the region with highest pixel value
int x,y;
srcimg=workImg;
for(y=;y<srcimg->height;y++)
for(x=;x<srcimg->width;x++)
{
CvPoint curp=cvPoint(x,y);
downleft.x=srcimg->width;downleft.y=srcimg->height;
upright.x=upright.y=;
cnt=; if(InRange(curp,srcimg))
Dye(&srcimg,curp);
if(cnt>Thres_KindNumber)
cvRectangle(workImg , downleft,upright,CV_RGB(,,),,CV_AA,);
}
Invalidate();
}
from: http://blog.csdn.net/abcjennifer/article/details/7334043
opencv 图像阴影检测的更多相关文章
- OpenCV图像轮廓检测
轮廓检测: 轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 一.关键函数1.1 cvFindContours函数功能:对图像进行轮廓检测,这个函数将 ...
- OpenCV: 图像连通域检测的递归算法
序言:清除链接边缘,可以使用数组进行递归运算; 连通域检测的递归算法是定义级别的检测算法,且是无优化和无语义失误的. 同样可用于寻找连通域 void ClearEdge(CvMat* MM,CvPoi ...
- OPENCV图像特征点检测与FAST检测算法
前面描述角点检测的时候说到,角点其实也是一种图像特征点,对于一张图像来说,特征点分为三种形式包括边缘,焦点和斑点,在OPENCV中,加上角点检测,总共提供了以下的图像特征点检测方法 FAST SURF ...
- 基于OpenCV的火焰检测(一)——图像预处理
博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...
- OpenCV特征点检测------ORB特征
OpenCV特征点检测------ORB特征 ORB是是ORiented Brief的简称.ORB的描述在下面文章中: Ethan Rublee and Vincent Rabaud and Kurt ...
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...
- opencv车道线检测
opencv车道线检测 完成的功能 图像裁剪:通过设定图像ROI区域,拷贝图像获得裁剪图像 反透视变换:用的是老师给的视频,没有对应的变换矩阵.所以建立二维坐标,通过四点映射的方法计算矩阵,进行反透视 ...
- OpenCV特征点检测算法对比
识别算法概述: SIFT/SURF基于灰度图, 一.首先建立图像金字塔,形成三维的图像空间,通过Hessian矩阵获取每一层的局部极大值,然后进行在极值点周围26个点进行NMS,从而得到粗略的特征点, ...
- 【转载】opencv实现人脸检测
全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下 http://blog.csdn.net/lsq2902101015/article ...
随机推荐
- CHARINDEX,PATINDEX,STUFF函数
-- CHARINDEX函数 -- 返回字符或者字符串在另一个字符串中的起始位置. -- 语法:CHARINDEX(expression1 , expression2 [,start_location ...
- HTTP 错误 404.3 - Not Found
在使用win2012服务器上的IIS发布网页的时候,出现下面的错误 解决办法: 将应用程序开发下的所有功能都安装. 如果上面的方法没解决问题的话,那么看看下图中的这些安装没,没有的话就继续安装.
- 一段Android里面打印CallStatck的代码
public void dumpCallStack() { java.util.Map<Thread, StackTraceElement[]> ts = Thread.getAllSta ...
- docker 感性介绍
Docker 允许开发者们将他们的应用打包放在云端的“容器”中,无需再修改就可以发布到任何流行的 Linux 机器上.由于采用沙盒机制,各应用之间没有任何接口,所以不用担心它们会相互干扰.也同样因为这 ...
- yii2.0 控制器加载不同的user组件
Yii::$app->user->id Yii::$app->user2->id Yii::$app->admin->id identityC ...
- [原]项目进阶 之 持续构建环境搭建(三)Maven环境搭建
上次的博文项目进阶 之 持续构建环境搭建(二)Nexus私服器中,我们搭建了一个Nexus的maven私服,这次我们来重点讲解一下Maven的安装和配置.这里说明一下这次的环境搭建,比较基础,但却非常 ...
- DB天气app冲刺二阶段第十天
昨天困到不行了 所以就写了那么几句..所以今天好好写写了要.. 今天的收获了一个很重要的问题 就还是api接口的事情,以前的那个接口虽然能用但是总是不稳定,今天由决定百度的一下然后就发现了一个很好用的 ...
- c语言编程之二叉树
利用链表建立二叉树,完成前序遍历.中序遍历.后序遍历. 建立二叉树用的是前序遍历建立二叉树: #include<stdio.h> #include<stdlib.h> #inc ...
- WPF 多线程处理(1)
WPF 多线程处理(1) WPF 多线程处理(2) WPF 多线程处理(3) WPF 多线程处理(4) WPF 多线程处理(5) WPF 多线程处理(6) 废话不多说,先上图: 多线程处理数据后在th ...
- ios 多任务学习笔记
一.检测多任务是否支持: - (BOOL) isMultitaskingSupported{ BOOL result = NO; if ([[UIDevice currentDevice] respo ...