weixin_42278560 2019-03-25 17:15 采纳率: 0%
浏览 1589

opencv实现检测瞳孔轮廓

用的是opencv3.4.0 已经实现人眼检测。想已经在检测出人眼的区域找出瞳孔的轮廓并计算面积。但老师运行不出来。是findContours()参数问题还是其他的啊?望大神们给个建议

int main()
{
CascadeClassifier faceCascader, eyeCascader;
String filename1 = "D:/opencv/newbuild/install/etc/haarcascades/haarcascade_frontalface_alt.xml";
String filename2 = "D:/opencv/newbuild/install/etc/haarcascades/haarcascade_eye.xml";
//vector pt; //绘制轨迹
double nowFrameNum, blinkFrameNum, frq;
nowFrameNum = blinkFrameNum = 0;
if (!faceCascader.load(filename1))
{
printf("can not load the face feature data \n");
return -1;
}
if (!eyeCascader.load(filename2))
{
printf("can not load the eye feature data \n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
VideoCapture capture;
capture.open(0);
Mat frame, gray, src;
vector faces, eyes;

while (capture.read(frame))
{
    flip(frame, frame, 1);
    src = frame;
    cvtColor(frame, gray, COLOR_BGR2GRAY);
    //直方图均衡
    equalizeHist(gray, gray);
    faceCascader.detectMultiScale(gray, faces, 1.1, 3, 0, Size(50, 50));
    Rect roi, rect;
    for (int i = 0; i < faces.size(); i++)
    {
        roi.x = faces[static_cast<int>(i)].x;
        roi.y = faces[static_cast<int>(i)].y;
        roi.width = faces[static_cast<int>(i)].width;
        roi.height = faces[static_cast<int>(i)].height / 2.0;
        Mat faceROI = frame(roi);
        eyeCascader.detectMultiScale(faceROI, eyes, 1.1, 7, 0, Size(20, 20));
        for (int j = 0; j < eyes.size(); j++)
        {
            rect.x = faces[static_cast<int>(i)].x + eyes[j].x + eyes[j].width / 2.0;
            rect.y = faces[static_cast<int>(i)].y + eyes[j].y + eyes[j].height / 2.0;
            rect.width = eyes[j].width;
            rect.height = eyes[j].height;
            circle(frame, Point(rect.x, rect.y), rect.width / 2.0, Scalar(0, 0, 255), 2, 8);

Mat eyesROI = frame(rect);
vector> contours;
vector hireachy;

    //Mat kernal = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
    //morphologyEx(eyesROI,eyesROI, CV_MOP_OPEN, kernal, Point(-1, -1));
    if (rect.width != 0 && roi.width != 0) 
    {
        cvtColor(eyesROI, eyesROI, CV_BGR2GRAY);
        findContours(eyesROI, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0,0));
    } 
        }
        rectangle(frame, faces[static_cast<int>(i)], Scalar(0, 255, 0), 2, 8, 0);
    }
    char q = waitKey(10);
    //Esc退出
    if (q == 27)
    {
        break;
    }

    //double area = contourArea(eyesROI);


    imshow("input", frame);
    nowFrameNum++;
    if (rect.width == 0) blinkFrameNum++;
    if (int(nowFrameNum) % 10 == 0)
    {
        cout << roi.area() << endl;
        cout << "眨眼频率为: " << blinkFrameNum << "  " << nowFrameNum << endl;
        frq = blinkFrameNum / nowFrameNum;
        cout << setprecision(2) << frq << endl;
        //cout << "area is " << area << endl;
    }
}
waitKey(0);
capture.release();
return 0;

}


  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-20 21:19
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!