opencv2反投影直方图以检測特定的图像内容
#ifndef HISTOGRAM_H_
#define HISTOGRAM_H_
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include<iostream>
#include <vector> using namespace std;
using namespace cv; class Histogram1D
{
private:
int histSize[1];
float hranges[2];
const float *ranges[1];
int channels[1];
public:
Histogram1D();
cv::MatND getHistogram(const cv::Mat &image);
cv::Mat getHistogramImage(const cv::Mat &image);
cv::Mat applyLookUp(const cv::Mat &image,const cv::Mat &lookup);
cv::Mat stretch(const cv::Mat &image,int minValue=0);
cv::Mat equalize(const cv::Mat &image);
cv::Mat calcBack(const cv::Mat &image,const cv::MatND hist);
cv::Mat threShold(const cv::Mat &image);
}; #endif /* HISTOGRAM_H_ */
#include"Histogram1D.h"
Histogram1D::Histogram1D()
{
histSize[0]=256;
hranges[0]=0.0;
hranges[1]=255.0;
ranges[0]=hranges;
channels[0]=0;
};
cv::MatND Histogram1D::getHistogram(const cv::Mat &image)
{
cv::MatND hist;
cv::calcHist(&image,1,channels,cv::Mat(),hist,1,histSize,ranges);
return hist;
};
cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image)
{
cv::MatND hist=getHistogram(image);
double maxVal=0;
double minVal=0;
cv::minMaxLoc(hist,&minVal,&maxVal,0,0);
cv::Mat histImg(histSize[0],histSize[0],CV_8U,cv::Scalar(255));
int hpt=static_cast<int>(0.9*histSize[0]);
for(int h=0;h<histSize[0];h++)
{
float binVal=hist.at<float>(h);
int intensity=static_cast<int>(binVal*hpt/maxVal);
cv::line(histImg,cv::Point(h,histSize[0]),cv::Point(h,histSize[0]-intensity),cv::Scalar::all(0));
}
return histImg;
};
cv::Mat Histogram1D::applyLookUp(const cv::Mat &image,const cv::Mat &lookup)
{
cv::Mat result;
cv::LUT(image,lookup,result);
return result;
}
cv::Mat Histogram1D::stretch(const cv::Mat &image,int minValue)
{
cv::MatND hist=getHistogram(image);
int imin=0;
for(;imin<histSize[0];imin++)
{
std::cout<<hist.at<float>(imin)<<std::endl;
if(hist.at<float>(imin)>minValue)
break;
}
int imax=histSize[0]-1;
for(;imax>=0;imax--)
{
if(hist.at<float>(imax)>minValue)
break;
}
int dim(256);
cv::Mat lookup(1,&dim,CV_8U);
for(int i=0;i<256;i++)
{
if(i<imin)lookup.at<uchar>(i)=0;
else if(i>imax)lookup.at<uchar>(i)=255;
else lookup.at<uchar>(i)=static_cast<uchar>(255.0*(i-imin)/(imax-imin)+0.5);
}
cv::Mat result;
result=applyLookUp(image,lookup);
return result;
}
cv::Mat Histogram1D::equalize(const cv::Mat &image)
{
cv::Mat result;
cv::equalizeHist(image,result);
return result;
}
cv::Mat Histogram1D::calcBack(const cv::Mat &image,const cv::MatND hist)
{
cv::Mat result;
cv::calcBackProject(&image,1,channels,hist,result,ranges,255.0);
return result;
}
cv::Mat Histogram1D::threShold(const cv::Mat &image)
{
cv::Mat thresholded;
cv::threshold(image,thresholded,0,255,cv::THRESH_BINARY);
return thresholded;
}
#include"Histogram1D.h" int main()
{
cv::Mat image=cv::imread("d:\\test\\opencv\\waves.jpg",0);
if( !image.data ) exit(0);
cv::Mat imageROI;
imageROI=image(cv::Rect(360,55,40,50)); cv::Mat back;
cv::Mat result; Histogram1D h;
cv::MatND hist=h.getHistogram(imageROI); namedWindow("hist");
imshow("hist",h.getHistogramImage(imageROI)); cv::normalize(hist,hist,1.0);
back=h.calcBack(image,hist);
result=h.threShold(back); namedWindow("Backprojection");
imshow("Backprojection",back); namedWindow("Detection Result");
imshow("Detection Result",result); waitKey(0);
return 0;
}
opencv2反投影直方图以检測特定的图像内容的更多相关文章
- 利用opencv中的级联分类器进行人脸检測-opencv学习(1)
OpenCV支持的目标检測的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本号的C++接口除了Haar特征以外 ...
- Viola-Jones人脸检測
OpenCV中有一个基于树的技术:Haar分类器,它建立了boost筛选式级联. 它能够识别出人脸和其它刚性物体. 对于检測"基本刚性"的物体(脸,汽车,自行车,人体等)这类识别任 ...
- OpenCV2马拉松第22圈——Hough变换直线检測原理与实现
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Ho ...
- OpenCV2马拉松第14圈——边缘检測(Sobel,prewitt,roberts)
收入囊中 差分在边缘检測的角色 Sobel算子 OpenCV sobel函数 OpenCV Scharr函数 prewitt算子 Roberts算子 葵花宝典 差分在边缘检測究竟有什么用呢?先看以下的 ...
- openCV2马拉松第19圈——Harris角点检測(自己实现)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/26824529 收入囊中 使用OpenCV的con ...
- OpenCV2马拉松第15圈——边缘检測(Laplace算子,LOG算子)
收入囊中 拉普拉斯算子 LOG算子(高斯拉普拉斯算子) OpenCV Laplacian函数 构建自己的拉普拉斯算子 利用拉普拉斯算子进行图像的锐化 葵花宝典 在OpenCV2马拉松第14圈--边缘检 ...
- OpenCV2马拉松第17圈——边缘检測(Canny边缘检測)
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g 收入囊中 利用OpenCV Canny函数进行边缘检測 掌握Canny算法基本理论 ...
- OpenCV特征点检測------Surf(特征点篇)
Surf(Speed Up Robust Feature) Surf算法的原理 ...
- 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...
随机推荐
- Visual Studio 2013 中使用断点
你可能已经很熟悉Visual Studio中的断点的基本功能.你在编辑器里代码的侧边点击,创建一个红色的圆点,然后运行应用程序,线程走到你所点的代码处停下,你可以用调试窗口查看代码状态. 你可能不熟悉 ...
- Lenovo笔记本电脑进入BIOS的方法
使用NOVO键开机进入BIOS的操作方法 适用范围:2012年后发布的部分笔记本产品,含:IdeaPad全系列.Lenovo G系列部分IdeaPad U或S系列,YOGA/FLEX全系列产品Leno ...
- System.TypeInitializationException
在连接数据库时,提示System.TypeInitializationException 数据库的连接字符串放在config文件中,而config中有两个文件,起初放在debug.comfig中,启动 ...
- 九度oj 题目1450:产生冠军
题目描述: 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C. 如果A打败了B ...
- fdisk分区自动挂载
理解/etc/fstab文件配置 首先打开这个文件我们查看下本身内容 vi /etc/fstab 或者 vim /etc/fstab 2 介绍下fstab配置 文件配置每一行属于一个配置,每个 ...
- 【Luogu】P2894酒店Hotel(线段树)
题目链接 我好蒻啊 题题看题解 线段树维护从左端点开始的最长连续空房.右端点结束的最长连续空房.整段区间的最长连续空房.区间非空房的个数. http://blog.csdn.net/qq_3955 ...
- c++ primer note
---恢复内容开始--- 1.decltype 2.auto 3.cbegin 4.cend 5.constexpr 6.(*Parray)[10]=&arr; //Parray 指向一个含有 ...
- Linux(10):期中架构(2)--- NFS存储服务 & 实时同步
1. 共享存储服务概念: # NFS是Network File System的缩写,中文意思是网络文件系统, # 它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录. 2. ...
- 标准C程序设计七---26
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- codevs3249搭积木
3249 搭积木 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description Petya有一个A×B×C的长方体积木,积 ...