0

我正在研究一个项目,将我的图像缩小到一个物体的轮廓(其实就是眼睛的瞳孔)。 现在我想对包含瞳孔轮廓的图像应用霍夫变换,但没有任何反应。 我的猜测是,你可以将hough变换应用于灰度图像,如何从轮廓恢复图像?

所以我想知道如何找回已经检测到的瞳孔轮廓的灰度部分,以便我可以对其应用hough变换。

+2

霍夫不关心强度,所以你的猜测是错误的。其次,二值图像是灰度图像,它恰好只有两个强度。 – mmgp 2013-02-21 00:52:56

+0

那么现在我应该怎么做才能在他的形象上画出圆圈? – userXktape 2013-02-21 01:17:04

+1

“但没有任何反应”真的没有帮助,你知道吗?现在有一个人知道你在做什么,因此在你设法改进问题之前,没有其他人能够帮助你。 – mmgp 2013-02-21 01:21:16

回答

0

假设你的视频源是一个正常的摄像头。我不确定霍夫能否工作。我试过了,它不起作用,如果我花更多时间,它可以工作。但是这里有一种基于颜色的方法可以帮助我。结果:https://s3-ap-southeast-1.amazonaws.com/kzl/eye.png

#include "stdafx.h" 
#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 
#include <time.h> 
#include "opencv2/objdetect/objdetect.hpp" 
using namespace cv; 
using namespace std; 


int s0=31,s1=96,s2=189, thresh=9; 
String face_cascade_name = "lbpcascade_frontalface.xml"; 
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; 
CascadeClassifier face_cascade,eyes_cascade; 

void proc(Mat frame) 
{ 
    double time = (double)getTickCount(); 
    std::vector<Rect> faces; 
    Mat frame_gray; 
    Mat eyeMask=Mat::zeros(frame.rows, frame.cols, CV_8UC1);; 
    cvtColor(frame, frame_gray, CV_BGR2GRAY); 
    equalizeHist(frame_gray, frame_gray); 

    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2,0, Size(50, 50)); 

    for(int i = 0; i < faces.size(); i++) 
    { 
     Mat faceROI = frame_gray(faces[i]); 
     std::vector<Rect> eyes; 

     eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30)); 
     if(eyes.size() == 2) 
     { 
      Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5); 
      ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 0), 2, 8, 0); 

      for(int j = 0; j < eyes.size(); j++) 
      { 
       Rect roi = Rect(faces[i].x+eyes[j].x,faces[i].y+eyes[j].y+(eyes[j].height*.25),eyes[j].width,eyes[j].height*.75); 
       Mat eye(frame,roi); 
       Mat eyeYuv; 
       vector<Mat> eyechs; 
       cvtColor(eye,eyeYuv,CV_BGR2YUV); 
       split(eyeYuv,eyechs); 
       Mat mask= eyechs[0]; 
       equalizeHist(mask,mask); 
       threshold(mask,mask,thresh,255,CV_THRESH_BINARY_INV); 
       mask.copyTo(eyeMask(roi)); 
      } 
      imshow("mask",eyeMask); 
     } 

    } 

    cvtColor(frame, frame, CV_BGR2YUV); 
    for(int i=0;i<eyeMask.rows;i++) 
    { 
     for(int j=0;j<eyeMask.cols;j++) 
     { 
      if(eyeMask.at<uchar>(i,j)>0) 
      { 
       frame.at<Vec3b>(i,j)[0]=(frame.at<Vec3b>(i,j)[0]+s0)%255; 
       frame.at<Vec3b>(i,j)[1]=(frame.at<Vec3b>(i,j)[1]+s1)%255; 
       frame.at<Vec3b>(i,j)[2]=(frame.at<Vec3b>(i,j)[2]+s2)%255; 
      } 
     } 
    } 
    cvtColor(frame, frame, CV_YUV2BGR); 

    time = ((double)getTickCount() - time)/getTickFrequency(); 
    std::ostringstream strs; 
    strs << time; 
    std::string text = strs.str(); 

    putText(frame, text, Point(30,30), FONT_HERSHEY_SCRIPT_SIMPLEX, .7, Scalar::all(255), 2,8); 
    imshow("cam", frame); 
} 

void run() 
{ 
    namedWindow("cam", CV_WINDOW_KEEPRATIO); 
    namedWindow("ctrl", CV_WINDOW_KEEPRATIO); 
    namedWindow("mask", CV_WINDOW_KEEPRATIO); 

    createTrackbar("s0", "ctrl", &s0, 255, NULL); 
    createTrackbar("s1", "ctrl", &s1, 255, NULL); 
    createTrackbar("s2", "ctrl", &s2, 255, NULL); 
    createTrackbar("irisThresh", "ctrl", &thresh, 255, NULL); 

    VideoCapture cap; 
    cap.open(0); 
    if(!cap.isOpened()) 
    { 
     cout << "cap error\n"; 
    } 

    if(!face_cascade.load(face_cascade_name)){ cout << "face cascade error\n"; return ; }; 
    if(!eyes_cascade.load(eyes_cascade_name)){ cout << "eye cascade error\n"; return ; }; 
    Mat frame; 
    cap >> frame; 


    for(;;) 
    { 
     cap >> frame; 
     resize(frame,frame,Size(320,240)); 
     proc(frame); 
     char c = (char)waitKey(10); 
     if(c == 27) 
      break; 
    } 
} 

int main(int argc, char ** argv) 
{ 
    run(); 
    cin.ignore(1); 
    return 0; 
}