iOS开发005 OpenCV--基于模板图片的标记识别

本文介绍了一种使用OpenCV进行皮肤检测的方法,并结合模板匹配技术实现了目标定位。通过加载两张图片,分别进行皮肤区域的提取及灰度转换,进而利用模板匹配找出目标位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明来源:http://blog.youkuaiyun.com/wanggsx918/article/details/23773729

效果图如下:




[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #import "UIImage+OpenCV.h"  
  2.   
  3. #import "MyViewController.h"  
  4. #import <opencv2/highgui/ios.h>  
  5. #import <opencv2/imgproc/imgproc_c.h>  
  6. #import <opencv2/core/core_c.h>  
  7. #import <opencv2/features2d/features2d.hpp>  
  8. #import <opencv2/nonfree/features2d.hpp>  
  9.   
  10. // Aperture value to use for the Canny edge detection  
  11. const int kCannyAperture = 7;  
  12.   
  13. @interface MyViewController ()  
  14. - (void)processFrame;  
  15. @end  
  16.   
  17. @implementation MyViewController  
  18.   
  19. @synthesize imageView = _imageView;  
  20. @synthesize imageView1 = _imageView1;  
  21.   
  22. - (void)viewDidLoad  
  23. {  
  24.     [super viewDidLoad];  
  25.       
  26.     //[self TakeColorFromImageHSV];  
  27.     UIImage *mImage =  [UIImage imageNamed:@"防伪标签007.jpg"];  
  28.     IplImage *srcIpl = [self convertToIplImage:mImage];  
  29.     IplImage *dscIpl = cvCreateImage(cvGetSize(srcIpl), srcIpl->depth, 1);  
  30.     [self SkinDetect:srcIpl withParam:dscIpl];  
  31.     IplImage *dscIplNew = cvCreateImage(cvGetSize(srcIpl),  IPL_DEPTH_8U, 3);  
  32.     cvCvtColor(dscIpl, dscIplNew, CV_GRAY2BGR);  
  33.     self.imageView.image = mImage;  
  34.       
  35.       
  36.     UIImage *mImage1 =  [UIImage imageNamed:@"temple005.jpg"];  
  37.     self.imageView1.image = mImage1;  
  38.     IplImage *srcIpl1 = [self convertToIplImage:mImage1];  
  39.     IplImage *dscIpl1 = cvCreateImage(cvGetSize(srcIpl1), srcIpl1 ->depth, 1);  
  40.     [self SkinDetect:srcIpl1 withParam:dscIpl1];  
  41.     IplImage *dscIplNew1 = cvCreateImage(cvGetSize(srcIpl1), IPL_DEPTH_8U, 3);  
  42.     cvCvtColor(dscIpl1, dscIplNew1, CV_GRAY2BGR);  
  43.       
  44.     IplImage *src = srcIpl;  
  45.     IplImage *srcResult = srcIpl;  //用来显示  
  46.     IplImage *templat = srcIpl1;  
  47.     IplImage *result;  
  48.     int srcW, srcH, templatW, templatH, resultH, resultW;  
  49.     srcW = src->width;  
  50.     srcH = src->height;  
  51.     templatW = templat->width;  
  52.     templatH = templat->height;  
  53.     resultW = srcW - templatW + 1;  
  54.     resultH = srcH - templatH + 1;  
  55.     result = cvCreateImage(cvSize(resultW, resultH), 321);  
  56.     cvMatchTemplate(src, templat, result, CV_TM_SQDIFF);  
  57.     double minValue, maxValue;  
  58.     CvPoint minLoc, maxLoc;  
  59.     cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);  
  60.     cvRectangle(srcResult, minLoc, cvPoint(minLoc.x + templatW, minLoc.y+ templatH), cvScalar(0,0,255));  
  61.   
  62.      
  63.     self.imageView1.image = [self convertToUIImage:srcResult];  
  64.       
  65. }  
  66.   
  67.   
  68.   
  69. /// UIImage类型转换为IPlImage类型  
  70. -(IplImage*)convertToIplImage:(UIImage*)image  
  71. {  
  72.     CGImageRef imageRef = image.CGImage;  
  73.     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
  74.     IplImage *iplImage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 4);  
  75.     CGContextRef contextRef = CGBitmapContextCreate(iplImage->imageData, iplImage->width, iplImage->height, iplImage->depth, iplImage->widthStep, colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);  
  76.     CGContextDrawImage(contextRef, CGRectMake(00, image.size.width, image.size.height), imageRef);  
  77.     CGContextRelease(contextRef);  
  78.     CGColorSpaceRelease(colorSpace);  
  79.     IplImage *ret = cvCreateImage(cvGetSize(iplImage), IPL_DEPTH_8U, 3);  
  80.     cvCvtColor(iplImage, ret, CV_RGB2BGR);  
  81.     cvReleaseImage(&iplImage);  
  82.     return ret;  
  83. }  
  84.   
  85. /// IplImage类型转换为UIImage类型  
  86. -(UIImage*)convertToUIImage:(IplImage*)image  
  87. {  
  88.     cvCvtColor(image, image, CV_BGR2RGB);  
  89.     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
  90.     NSData *data = [NSData dataWithBytes:image->imageData length:image->imageSize];  
  91.     CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);  
  92.     CGImageRef imageRef = CGImageCreate(image->width, image->height, image->depth, image->depth * image->nChannels, image->widthStep, colorSpace, kCGImageAlphaNone | kCGBitmapByteOrderDefault, provider, NULLfalse, kCGRenderingIntentDefault);  
  93.     UIImage *ret = [UIImage imageWithCGImage:imageRef];  
  94.     CGImageRelease(imageRef);  
  95.     CGDataProviderRelease(provider);  
  96.     CGColorSpaceRelease(colorSpace);  
  97.     return ret;  
  98. }  
  99.   
  100. - (void)viewDidUnload  
  101. {  
  102.     [super viewDidUnload];  
  103.     self.imageView = nil;  
  104.     self.imageView1=nil;  
  105.       
  106.     delete _videoCapture;  
  107.     _videoCapture = nil;  
  108. }  
  109.   
  110.   
  111. @end  
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值