OpenCV人脸检测

使用OpenCV进行人脸识别与检测
#include <opencv/cv.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>



static CvMemStorage* storage = 0;   //创建一个内存存储器,来统一管理各种动态对象的内存
static CvHaarClassifierCascade* cascade = 0;    //分类器

void detect_and_draw( IplImage* image );    //检测人脸并标记

const char* cascade_name =
"haarcascade_frontalface_alt_tree.xml";      //分类器名称

int main( int argc, char** argv )
{
    CvCapture* capture = 0;     //视频的结构体
    IplImage *frame, *frame_copy = 0;   //读取每一帧的结构体

    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );    //载入分类器

    if( !cascade )
    {
        fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
        fprintf( stderr,
            "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );
        return -1;
    }
    storage = cvCreateMemStorage(0);

    cvNamedWindow( "result", 1 );   //1表示autosize



//检测视频
    capture = cvCaptureFromCAM(-1); //调用摄像头

    if( capture )
    {
        for(;;)
        {
            if( !cvGrabFrame( capture ))    //从摄像头或者视频文件中抓取帧
                break;
            frame = cvRetrieveFrame( capture );     //取回由函数cvGrabFrame抓取的图像
            if( !frame )
                break;
            if( !frame_copy )   //复制图像
                frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
                IPL_DEPTH_8U, frame->nChannels );

            if( frame->origin == IPL_ORIGIN_TL )    //图像顶点是否在顶-左
                cvCopy( frame, frame_copy, 0 );
            else
                cvFlip( frame, frame_copy, 0 );     //翻转

            IplImage *equ = cvCreateImage(cvGetSize(frame_copy),8, 1);
            IplImage *gray = cvCreateImage(cvGetSize(frame_copy), 8, 1);
            cvCvtColor(frame_copy, gray, CV_BGR2GRAY);      //转灰度图
            cvEqualizeHist(gray, equ);      //直方图均衡化

            //cvNamedWindow("yuantu");
            //cvNamedWindow("equ");
            //cvShowImage("yuantu",gray);
            //cvShowImage("equ",equ);

            detect_and_draw( frame_copy );      //人脸检测并标记

            if( cvWaitKey(1) >= 0 )
                break;
            //cvReleaseImage(&gray);
            //cvReleaseImage(&equ);
        }



        cvReleaseImage( &frame_copy );
        cvReleaseCapture( &capture );
    }

    cvWaitKey(-1); //检测图片的时候,等待显示
    cvDestroyWindow("result");

    return 0;
}

void detect_and_draw( IplImage* img )
{
    static CvScalar colors[] =      //用8种颜色标记人脸
    {
        {0,0,255},
        {0,128,255},
        {0,255,255},
        {0,255,0},
        {255,128,0},
        {255,255,0},
        {255,0,0},
        {255,0,255}
    };

    double scale = 1.2;     //缩放因子
    IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
    IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),        //四舍五入
        cvRound (img->height/scale)),
        8, 1 );
    int i;

    cvCvtColor( img, gray, CV_BGR2GRAY );       //转灰度图
    cvResize( gray, small_img, CV_INTER_LINEAR );   //调整大小
    cvEqualizeHist( small_img, small_img );     //使灰度图象直方图均衡化
    cvClearMemStorage( storage );       //重置

    if( cascade )
    {
        double t = (double)cvGetTickCount();    //返回从操作系统启动所经过的毫秒数
        CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
            1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
            cvSize(30, 30) );

        printf("face's total is %d\n",faces->total);

        t = (double)cvGetTickCount() - t;
        printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );    //cvGetTickFrequency()返回每秒的计时周期数
        for( i = 0; i < (faces ? faces->total : 0); i++ )
        {
            CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
            CvRect tr(r->x,r->y,r->width,r->height);
            //用矩形框框出
            cvRectangle(img, cvPoint(r->x * scale, r->y * scale), cvPoint( (r->x + r->width) * scale, (r->y + r->height)  * scale), colors[i%8], 3, 8, 0);

            //用原型框出
            CvPoint center;
            int radius;
            center.x = cvRound((r->x + r->width*0.5)*scale);
            center.y = cvRound((r->y + r->height*0.5)*scale);
            radius = cvRound((r->width + r->height)*0.25*scale);
            cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );

            //用ROI截取人脸区域
            cvSetImageROI(small_img, tr);   //用缩放后的图,设置源图像ROI
            CvSize size1 = cvSize(r->width, r->height);
            IplImage* roi_img = cvCreateImage(size1,small_img->depth,small_img->nChannels);
            cvCopy(small_img,roi_img);      //复制图像
            cvResetImageROI(small_img);     //源图像用完后,清空ROI
            cvNamedWindow("picture", CV_WINDOW_AUTOSIZE);
            cvShowImage("picture", roi_img);
            //cvReleaseImage( &roi_img );
            //cvDestroyWindow("picture");
        }
    }

    cvShowImage( "result", img );
    cvReleaseImage( &gray );
    cvReleaseImage( &small_img );
}

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值