java opencv 提取车牌_opencv-车牌区域提取

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/features2d/features2d.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include

// Mser车牌目标检测

std::vector<:rect> mserGetPlate(cv::Mat srcImage)

{

// HSV空间转换

cv::Mat gray, gray_neg;

cv::Mat hsi;

cv::cvtColor(srcImage, hsi, CV_BGR2HSV);

// 通道分离

std::vector<:mat> channels;

cv::split(hsi, channels);

// 提取h通道

gray = channels[1];

// 灰度转换

cv::cvtColor(srcImage, gray, CV_BGR2GRAY);

// 取反值灰度

gray_neg = 255 - gray;

std::vector<:vector> > regContours;

std::vector<:vector> > charContours;

// MSER+操作

cv::MSER(2, 10, 5000, 0.5, 0.3)(gray, regContours);

// MSER-操作

cv::MSER(2, 2, 400, 0.1, 0.3)(gray_neg, charContours);

cv::Mat mserMapMat =

cv::Mat::zeros(srcImage.size(), CV_8UC1);

cv::Mat mserNegMapMat =

cv::Mat::zeros(srcImage.size(), CV_8UC1);

// MSER+ 检测

for(int i = (int)regContours.size()-1; i >= 0; i--)

{

// 根据检测区域点生成mser+结果

const std::vector<:point>& r = regContours[i];

for (int j = 0; j < (int)r.size(); j++ )

{

cv::Point pt = r[j];

mserMapMat.at(pt) = 255;

}

}

// MSER- 检测

for(int i = (int)charContours.size()-1; i >= 0; i--)

{

// 根据检测区域点生成mser-结果

const std::vector<:point>& r = charContours[i];

for (int j = 0; j < (int)r.size(); j++ )

{

cv::Point pt = r[j];

mserNegMapMat.at(pt) = 255;

}

}

// mser结果输出

cv::Mat mserResMat;

// mser+与mser-位与操作

mserResMat= mserMapMat & mserNegMapMat;

cv::imshow("mserMapMat", mserMapMat);

cv::imshow("mserNegMapMat", mserNegMapMat);

cv::imshow("mserResMat", mserResMat);

// 闭操作连接缝隙

cv::Mat mserClosedMat;

cv::morphologyEx(mserResMat, mserClosedMat,

cv::MORPH_CLOSE, cv::Mat::ones(1, 20, CV_8UC1));

cv::imshow("mserClosedMat", mserClosedMat);

// 寻找外部轮廓

std::vector<:vector> > plate_contours;

cv::findContours(mserClosedMat, plate_contours,

CV_RETR_EXTERNAL,

CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));

// 候选车牌区域判断输出

std::vector<:rect> candidates;

for (size_t i = 0; i != plate_contours.size(); ++i)

{

// 求解最小外界矩形

cv::Rect rect = cv::boundingRect(plate_contours[i]);

// 宽高比例

double wh_ratio = rect.width / double(rect.height);

// 不符合尺寸条件判断

if (rect.height > 20 && wh_ratio > 4 && wh_ratio < 7)

candidates.push_back(rect);

}

return candidates;

}

int main()

{

cv::Mat srcImage =

cv::imread("car.jpg");

if(srcImage .empty())

return-1;

// 候选车牌区域检测

std::vector<:rect> candidates;

candidates = mserGetPlate(srcImage);

// 车牌区域显示

for (int i = 0; i < candidates.size(); ++i) {

cv::imshow("rect", srcImage(candidates[i]));

cv::waitKey();

}

return 0;

}

原图

c1ceaaa474c0da9100b28dbaf17f74b8

效果图

73bf3975b10bb76cf721806912f6b39d

0e6a443f61793a2c460e7206e3155f40

http://lib.csdn.net/base/opencv

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值