为什么我无法在 Open CV 中正确显示矩形?

Why can't I get a rectangle to be displayed properly in Open CV?

本文关键字:显示 CV Open 为什么      更新时间:2023-10-16

我正在使用 Open CV 测试已经很经典的人脸检测代码,我正在Rect vector中获取人脸。所以我想让获得的Rects显示在图像上。

while (true) {
    camera >> cameraFrame;
    if (cameraFrame.empty ()) {
        cerr << "Error: Could grab any frame!" << endl;
        exit(2);
    }
    imshow("Hola mundo", cameraFrame);
    cameraFrame = shrinkImage(turn2Gray(cameraFrame));
    imshow("Hola mundo gris", cameraFrame);
    equalizeHist(cameraFrame, equalizedImage);
    imshow("Hola mundo surreal y perturbador", equalizedImage);
    int flags = CASCADE_SCALE_IMAGE;
    Size minFeatureSize(20,20);
    float searchScaleFactor = 1.1f;
    int minNeighbors = 4;
    std::vector<Rect> faces;
    faceDetector.detectMultiScale(equalizedImage, faces, searchScaleFactor, minNeighbors, flags, minFeatureSize);
    cout << "Caras: " << faces.size() << endl;
    for (i=0; i< (int) faces.size(); i++) {
        rectangle( equalizedImage, faces[i], CV_RGB(0,255,0), 2, 8, 0 );
    }
    if (waitKey(20) == 27) {
    }
}

我从来没有显示任何矩形。我的rectangle()功能出了什么问题?

我做了建议的编辑,这就是现在的检测周期

while (true) {
        camera >> cameraFrame;
        if (cameraFrame.empty ()) {
            cerr << "Error: Could grab any frame!" << endl;
            exit(2);
        }
        imshow("Hola mundo", cameraFrame);
        greyFrame = shrinkImage(turn2Gray(cameraFrame));
        imshow("Hola mundo gris", greyFrame);
        equalizeHist(greyFrame, equalizedImage);
        imshow("Hola mundo surreal y perturbador", equalizedImage);

        faceDetector.detectMultiScale(equalizedImage, faces, searchScaleFactor, minNeighbors, flags, minFeatureSize);
        cout << "Caras: " << faces.size() << endl;
        for (i=0; i < faces.size(); i++) {
            rectangle( cameraFrame, faces[i], CV_RGB(0,255,0), 2, 8, 0 );
        }
        imshow("Hola Diego", cameraFrame);
        if (waitKey(20) == 27) {
            break;
        }
    }

您正在尝试将RGB颜色绘制到灰度img上,还需要在矩形绘制执行imshow(),然后waitKey()来更新窗口

尝试:

Mat greyFrame = shrinkImage(turn2Gray(cameraFrame)); // make a new grey mat, keep the original for drawing later
imshow("Hola mundo gris", greyFrame);
equalizeHist(greyFrame, equalizedImage);
imshow("Hola mundo surreal y perturbador", equalizedImage);
// ...
for (i=0; i< (int) faces.size(); i++) {
    rectangle( cameraFrame, faces[i], CV_RGB(0,255,0), 2, 8, 0 );
}
imshow("Hola diego", cameraFrame);
if (waitKey(20) == 27) {
    break;
}