opecv 证件照处理
生活随笔
收集整理的這篇文章主要介紹了
opecv 证件照处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
測試圖片:
?
方法1:
#include "cv.h"#include "cxcore.h"#include "highgui.h"/****opencvchina.com每周一練第十三期**作者:opencvchina.com會員 ---> zhongguo*/void getAverage(IplImage* image,float* avg);//計算圖像sampleImageName hsv三個通道的均值//hSampleAvg:h通道的均值//sSampleAvg:s通道的均值//vSampleAvg:v通道的均值void init(char* sampleImageName , float* hSampleAvg , float* sSampleAvg, float* vSampleAvg){IplImage *srcColor;srcColor = cvLoadImage(sampleImageName,CV_LOAD_IMAGE_COLOR);if(!srcColor){printf("fail to load Image \n");exit(0);}IplImage* hsvFloat = cvCreateImage(cvGetSize(srcColor),32,3);IplImage* srcColorFloat = cvCreateImage(cvGetSize(srcColor),32,3);cvConvertScale(srcColor,srcColorFloat);cvCvtColor(srcColorFloat,hsvFloat,CV_BGR2HSV);IplImage* h = cvCreateImage(cvGetSize(srcColor),32,1);IplImage* s = cvCreateImage(cvGetSize(srcColor),32,1);IplImage* v = cvCreateImage(cvGetSize(srcColor),32,1);cvSplit(hsvFloat,h,s,v,NULL);getAverage(h,hSampleAvg);getAverage(s,sSampleAvg);getAverage(v,vSampleAvg);cvReleaseImage(&srcColor);cvReleaseImage(&hsvFloat);cvReleaseImage(&srcColorFloat);cvReleaseImage(&h);cvReleaseImage(&s);cvReleaseImage(&v);}//計算圖像的均值void getAverage(IplImage* image,float* avg){int x,y;float sum = 0 ;for(y=0;y<image->height;y++)for(x=0;x<image->width;x++){float value = cvGetReal2D(image,y,x);sum = sum + value;}*avg = sum/(float)(image->height*image->width);}int main(int argc, char* argv[]){float hSampleAvg , sSampleAvg, vSampleAvg , minH,maxH,disH;//加載樣本圖片 并計算hsv三個通道的均值init("sample1.jpg" , &hSampleAvg , &sSampleAvg, &vSampleAvg);IplImage *srcColor , *hsvFloat ,*srcColorFloat,*h,*s,*v;//加載樣本證件照圖像srcColor = cvLoadImage("1.jpg",CV_LOAD_IMAGE_COLOR);if(!srcColor){printf("fail to load image\n");return 0;}hsvFloat = cvCreateImage(cvGetSize(srcColor),32,3);srcColorFloat = cvCreateImage(cvGetSize(srcColor),32,3);cvConvertScale(srcColor,srcColorFloat);//顏色空間轉換 BGR-->HSVcvCvtColor(srcColorFloat,hsvFloat,CV_BGR2HSV);h = cvCreateImage(cvGetSize(srcColor),32,1);s = cvCreateImage(cvGetSize(srcColor),32,1);v = cvCreateImage(cvGetSize(srcColor),32,1);//分離h s v三個通道cvSplit(hsvFloat,h,s,v,NULL);for(int y=0;y<hsvFloat->height;y++){for(int x=0;x<hsvFloat->width;x++){float hValue = cvGetReal2D(h,y,x);float sValue = cvGetReal2D(s,y,x);float vValue = cvGetReal2D(v,y,x);minH = hValue < hSampleAvg ? hValue : hSampleAvg ;maxH = hValue > hSampleAvg ? hValue : hSampleAvg ;disH = MIN(maxH-minH,360-maxH+minH);//與樣本圖像的h s v三個通道的均值比較if((fabs(sValue-sSampleAvg)<0.2) && disH<40 && (fabs(vValue - vSampleAvg)<40)){cvSet2D(srcColor,y,x,cvScalar(255,255,255,0));}}}//顯示證件照圖像cvNamedWindow("src");cvShowImage("src",srcColor);cvWaitKey(0);//釋放圖像資源cvReleaseImage(&srcColor);cvReleaseImage(&hsvFloat);cvReleaseImage(&srcColorFloat);cvReleaseImage(&h);cvReleaseImage(&s);cvReleaseImage(&v);return 0;}方法2:
#include "cv.h"#include "highgui.h"#include <iostream>using namespace std;/****opencvchina.com每周一練第十三期**作者:opencvchina.com會員 ---> JL2012JL*/int main(){IplImage*src=cvLoadImage("people.jpg");cvNamedWindow("cr");IplImage*ycrcb=cvCloneImage(src);IplImage*crdst=cvCloneImage(src);IplImage*s1=cvCreateImage(cvGetSize(src),8,1);cvCvtColor(src,ycrcb,CV_BGR2YCrCb);cvSplit(ycrcb,NULL,s1,NULL,NULL);int crh=255;int crl=115;cvCreateTrackbar("crh","cr",&crh,256,NULL);cvCreateTrackbar("crl","cr",&crl,256,NULL);cvShowImage("cr",s1);cvShowImage("src",src);while(1){cvSplit(ycrcb,NULL,s1,NULL,NULL);cvInRangeS(s1,cvScalarAll(crl),cvScalarAll(crh),s1);cvDilate(s1,s1);cvErode(s1,s1);cvZero(crdst);cvCopy(src,crdst,s1);cvShowImage("crdst",crdst);if(cvWaitKey(10)==27)break;}cvNot(s1,s1);cvSet(crdst,cvScalarAll(255),s1);cvShowImage("dst",crdst);cvWaitKey(0);cvDestroyWindow("cr");cvReleaseImage(&src);cvReleaseImage(&ycrcb);cvReleaseImage(&s1);cvReleaseImage(&crdst);return 0;}
?
?
總結
以上是生活随笔為你收集整理的opecv 证件照处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PR初始入门
- 下一篇: HR入门书籍推荐,这本书学人力资源的必看