You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
6.6 KiB
Plaintext

//
// RootViewController.m
// lpr
//
// Created by baotim on 2018/10/26.
// Copyright © 2018 lprSample. All rights reserved.
//
#import "RootViewController.h"
#import <Masonry/Masonry.h>
#import "Utility.h"
#import "Pipeline.h"
#import "CameraViewController.h"
@interface RootViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@property (nonatomic, strong) UIButton* albumButton;
@property (nonatomic, strong) UIButton* cameraButton;
@property (nonatomic, strong) UIImageView* imageView;
@property (nonatomic, strong) UILabel* resultLabel;
@end
@implementation RootViewController
{
cv::Mat source_image;
}
#pragma mark - Lazy Initialize
- (UIButton *)albumButton
{
if (!_albumButton) {
_albumButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_albumButton setTitle:@"打开相册" forState:UIControlStateNormal];
[_albumButton setBackgroundColor:[UIColor redColor]];
[_albumButton addTarget:self action:@selector(openAlbum) forControlEvents:UIControlEventTouchUpInside];
}
return _albumButton;
}
- (UIButton *)cameraButton
{
if (!_cameraButton) {
_cameraButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_cameraButton setBackgroundColor:[UIColor redColor]];
[_cameraButton setTitle:@"实时拍照" forState:UIControlStateNormal];
[_cameraButton addTarget:self action:@selector(openCamera) forControlEvents:UIControlEventTouchUpInside];
}
return _cameraButton;
}
- (UIImageView *)imageView
{
if (!_imageView) {
_imageView = [[UIImageView alloc] init];
_imageView.contentMode = UIViewContentModeScaleAspectFit;
}
return _imageView;
}
- (UILabel *)resultLabel
{
if (!_resultLabel) {
_resultLabel = [UILabel new];
_resultLabel.textColor = [UIColor redColor];
_resultLabel.textAlignment = NSTextAlignmentLeft;
_resultLabel.font = [UIFont systemFontOfSize:15];
}
return _resultLabel;
}
#pragma mark - Life Cycle
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = @"车牌识别Demo";
[self.view addSubview:self.albumButton];
[self.albumButton mas_makeConstraints:^(MASConstraintMaker* make) {
make.centerX.equalTo(self.view).offset(-80);
make.bottom.equalTo(self.mas_bottomLayoutGuideTop).offset(-20);
make.width.mas_equalTo(100);
make.height.mas_equalTo(50);
}];
[self.view addSubview:self.cameraButton];
[self.cameraButton mas_makeConstraints:^(MASConstraintMaker* make) {
make.centerX.equalTo(self.view).offset(80);
make.bottom.equalTo(self.albumButton);
make.width.mas_equalTo(100);
make.height.mas_equalTo(50);
}];
[self.view addSubview:self.resultLabel];
[self.resultLabel mas_makeConstraints:^(MASConstraintMaker* make) {
make.left.right.equalTo(self.view);
make.bottom.lessThanOrEqualTo(self.albumButton.mas_top);
}];
[self.view addSubview:self.imageView];
[self.imageView mas_makeConstraints:^(MASConstraintMaker* make) {
make.top.left.right.equalTo(self.view);
make.bottom.lessThanOrEqualTo(self.resultLabel.mas_top);
}];
}
#pragma mark - Actions
- (void)openAlbum
{
UIImagePickerController* picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
return;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:picker animated:YES completion:nil];
}
- (void)openCamera
{
CameraViewController* video = [CameraViewController new];
video.resultCB = ^(NSString* text, UIImage* image) {
self.imageView.image = image;
self.resultLabel.text = text;
};
[self presentViewController:video animated:YES completion:nil];
}
#pragma mark - Private Methods
- (NSString *)getPath:(NSString*)fileName
{
NSString *bundlePath = [NSBundle mainBundle].bundlePath;
NSString *path = [bundlePath stringByAppendingPathComponent:fileName];
return path;
}
- (void)simpleRecognition:(cv::Mat&)src
{
NSString *path_1 = [self getPath:@"cascade.xml"];
NSString *path_2 = [self getPath:@"HorizonalFinemapping.prototxt"];
NSString *path_3 = [self getPath:@"HorizonalFinemapping.caffemodel"];
NSString *path_4 = [self getPath:@"Segmentation.prototxt"];
NSString *path_5 = [self getPath:@"Segmentation.caffemodel"];
NSString *path_6 = [self getPath:@"CharacterRecognization.prototxt"];
NSString *path_7 = [self getPath:@"CharacterRecognization.caffemodel"];
std::string *cpath_1 = new std::string([path_1 UTF8String]);
std::string *cpath_2 = new std::string([path_2 UTF8String]);
std::string *cpath_3 = new std::string([path_3 UTF8String]);
std::string *cpath_4 = new std::string([path_4 UTF8String]);
std::string *cpath_5 = new std::string([path_5 UTF8String]);
std::string *cpath_6 = new std::string([path_6 UTF8String]);
std::string *cpath_7 = new std::string([path_7 UTF8String]);
pr::PipelinePR pr2 = pr::PipelinePR(*cpath_1, *cpath_2, *cpath_3, *cpath_4, *cpath_5, *cpath_6, *cpath_7);
std::vector<pr::PlateInfo> list_res = pr2.RunPiplineAsImage(src);
std::string concat_results = "";
for(auto one:list_res) {
if(one.confidence>0.7) {
concat_results += one.getPlateName()+",";
}
}
NSString *str = [NSString stringWithCString:concat_results.c_str() encoding:NSUTF8StringEncoding];
if (str.length > 0) {
str = [str substringToIndex:str.length-1];
str = [NSString stringWithFormat:@"识别结果: %@",str];
} else {
str = [NSString stringWithFormat:@"识别结果: 未识别成功"];
}
[self.resultLabel setText:str];
}
#pragma mark - UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[picker dismissViewControllerAnimated:YES completion:nil];
UIImage* temp = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
UIImage *temp_image = [Utility scaleAndRotateImageBackCamera:temp];
source_image = [Utility cvMatFromUIImage:temp_image];
[self simpleRecognition:source_image];
self.imageView.image = temp;
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
@end