Palm Finger segmentation algorithm (source code)

Source: Internet
Author: User

Development environment

Development environment

    • Up to Bits Windows OS (Win8.1)
    • VS2013
    • OpenCV 2.4.9
Functional principle

Algorithm requirements

Complete segmentation of each finger in the palm picture taken by the camera for fingerprint identification

Algorithmic flow

Core code

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 6667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611 7118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 158159160161162163164165166167168169 #ifdef time_run_cost double duration = static_cast<double> (Cv::gettickcount ()); time#endif cout << "filename=" << filename <<endl; Mat src = imread (filename, cv_load_image_color);if (Src.empty ()){cout << "Imread error!!!"; GetChar ();return -1; }#ifdef bob_dbg_com memset (Out_filename, 0, sizeof (out_filename)/ sizeof (char)); sprintf (Out_filename, "%s-%s.jpg", Out_name,"0-0src"); Imwrite (Out_filename, SRC);#endif //bob_dbg_com #if 0 int scalesize = 4; Resize (src, src, Size (src.cols/scalesize, Src.rows/scalesize),0, 0, Cv_inter_area); memset (Out_filename, 0, sizeof (out_filename)/ sizeof (char)); sprintf (Out_filename, "%s-%s.jpg", Out_name, "0-0src"); Imwrite (Out_filename, SRC);#endif #if 1 cout << "Cut ..." << Endl; int width = src.cols;int height = src.rows;float scale = 0.8; cout << "width=" << width << ", height=" << height << endl; rect rect(0, 0, width, height*scale); Mat imgcut;imgcut = src (rect). Clone ();#endif //mat imgcut = src; cout << "Filter ..." << Endl; //Filter2d (Imgcut, Imgcut,-1, kernel);Gaussianblur (Imgcut, Imgcut, Size (5, 5), 0, 0); //Blur (Imgcut, Imgcut, Size (5, 5));#if 0 cout << "Equalizehist ..." << Endl; Mat matoutequalizehist = Mat (Imgcut.size (), CV_8UC3);//iplimage* pimgoutequalizehist = Cvcreateimage (Cvsize (Cameraframe.cols, cameraframe.rows), IPL_DEPTH_8U, 3);Iplimage pimginequalizehist = (iplimage) (imgcut);//mat-> iplimageiplimage* pimgoutequalizehist = Equalizehistcolorimage (&pimginequalizehist); matoutequalizehist = Pimgoutequalizehist;//iplimage-Mat#endif // outMat imgsrc = Mat (Imgcut.size (), CV_8UC1); Imgcut.copyto (IMGSRC); Mat Imgcontour = Mat (Imgsrc.size (), CV_8UC1);#ifdef finger_extract_at_night cout << "Nigth,threshold ..." << Endl; Mat imgtmp;//= Mat (Imgcut.size (), CV_8UC1);Cvtcolor (IMGSRC, Imgtmp, Cv_rgb2gray), Cvthresholdotsu (& (Iplimage) imgtmp), & ((iplimage) imgtmp)); Imgtmp.copyto (Imgcontour);#Else cout << "Day,skin ..." << Endl; Mat imgSkin2 = Mat (Imgsrc.size (), CV_8UC1), iplimage* pImgSkin2 = Cvcreateimage (Cvsize (Imgsrc.cols, imgsrc.rows), Ipl_ DEPTH_8U,1);Iplimage PImg2 = (iplimage) (IMGSRC);//mat-> iplimageCvskinotsu (&pimg2, pImgSkin2); imgSkin2 = pImgSkin2;//iplimage-Mat//mat Imgskin = Mat (Imgsrc.size (), CV_8UC1);Imgskin2.copyto (Imgcontour);#endif ///////////////////////Contourscout << "Find contours ..." << Endl; vector<VECTOR<CV::P oint> > Contours; vector<vec4i> hierarchy;Findcontours (Imgcontour, contours, hierarchy,cv_retr_external, Cv_chain_approx_simple, CV::P oint (0, 0)); Sort (Contours.begin (), Contours.end (), comparecontourareas);int contours_num = Contours.size ();cout << "contours_num=" << contours_num << endl; #if 0 vector<Vector<point>>::const_iterator itcontours = Contours.begin (); //for (int i = 0; i < contours.size (); i++)For (; Itcontours! = Contours.end (); ++itcontours){cout << "Size:" << itcontours->size () << Endl; The number of points each profile contains }#endif #if 1 //usd //eliminate too short or too long contoursint cmin = 100; //Minimum contour length //int cmax=;//maximum contour lengthvector<Vector<point>>::const_iterator itc = Contours.begin (); While (itc! = Contours.end ()){//if (Itc->size () < Cmin | | itc->size () > Cmax)if (itc->size () < Cmin) {ITC = Contours.erase (ITC);}Else++ITC;} Contours_num = Contours.size ();cout << endl << "Contours_num after eliminate=" << contours_num << Endl; #endif //Extract the contour imgcout << "Extract contours ..." << Endl; if (contours_num >= 4) {Mat img1, Img2, IMG3, IMG4;std::VECTOR<CV::P oint> biggest1contour = contours[contours_num- 1]; std::VECTOR<CV::P oint> biggest2contour = Contours[contours_num- 2]; std::VECTOR<CV::P oint> biggest3contour = Contours[contours_num- 3]; std::VECTOR<CV::P oint> biggest4contour = Contours[contours_num- 4]; std::VECTOR<CV::P oint> smallestcontour = contours[0]; ExtractFingerImg2 (contours, imgsrc, IMG1, Contours_num,1); ExtractFingerImg2 (contours, imgsrc, Img2, Contours_num,2);ExtractFingerImg2 (contours, imgsrc, IMG3, Contours_num,3);ExtractFingerImg2 (contours, imgsrc, IMG4, Contours_num,4);}Else if (contours_num = = 3) {Mat img1, img2, IMG3;std::VECTOR<CV::P oint> biggest1contour = contours[contours_num- 1]; std::VECTOR<CV::P oint> biggest2contour = Contours[contours_num- 2]; std::VECTOR<CV::P oint> biggest3contour = Contours[contours_num- 3]; std::VECTOR<CV::P oint> smallestcontour = contours[0]; ExtractFingerImg2 (contours, imgsrc, IMG1, Contours_num,1);ExtractFingerImg2 (contours, imgsrc, Img2, Contours_num,2);ExtractFingerImg2 (contours, imgsrc, IMG3, Contours_num,3);}Else if (contours_num = = 2) {Mat img1, img2;std::VECTOR<CV::P oint> biggest1contour = contours[contours_num- 1]; std::VECTOR<CV::P oint> biggest2contour = Contours[contours_num- 2]; std::VECTOR<CV::P oint> smallestcontour = contours[0]; ExtractFingerImg2 (contours, imgsrc, IMG1, Contours_num,1);ExtractFingerImg2 (contours, imgsrc, Img2, Contours_num,2);}Else if (contours_num = = 1) {Mat img1;std::VECTOR<CV::P oint> biggest1contour = contours[contours_num- 1]; std::VECTOR<CV::P oint> smallestcontour = contours[0]; ExtractFingerImg2 (contours, imgsrc, IMG1, Contours_num,1);}Else{cout << "error" << Endl; }#ifdef time_run_cost Duration =static_cast<double> (Cv::gettickcount ())-duration; Duration/= cv::gettickfrequency ();//The elapsed time in MScout << "Time cost=" << duration << "s" <<Endl; #endif #ifdef bob_dbg_com memset (Out_filename, 0, sizeof (out_filename)/ sizeof (char)); sprintf (Out_filename, "%s-%s.jpg", Out_name, "4-imgcontoursinsrc"); Imwrite (Out_filename, IMGSRC);//imwrite ("4-imgcontoursinsrc.jpg", imgsrc);#endif //bob_dbg_com
Algorithm effect

Daytime complex scene

Night scene

Batch test Scenario

Go to: http://skyseraph.com/2014/07/24/CV/%E6%89%8B%E6%8E%8C%E6%89%8B%E6%8C%87%E5%88%86%E5%89%B2%E7%AE%97%E6%B3%95/

Palm Finger segmentation algorithm (source code)

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.