1

我正在尝试编写用于检测 OpenCV 中的对象的代码。但我不知道我的笔记本电脑网络摄像头出了什么问题,我只是得到一个灰色窗口。我的意思是网络摄像头 LED 亮着,但窗口是灰色的,什么也没有显示。我搜索了该网站,我知道有人遇到同样的问题,并且之前已经解释过,但没有一个解决方案对我有用。无论如何,这是我的代码,如果你能帮助我,我会很高兴!谢谢。

顺便说一句,我使用的是 Windows 8.1、OpenCV 2.2 和 Visual c++ 2010 Express。如果在 Windows 或任何方面可能有任何不兼容,请告诉我。

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>

#include<iostream>

int main() {
    cv::VideoCapture capWebcam(0);

    if (capWebcam.isOpened() == false) {
        std::cout << "error: capWebcam not accessed successfully\n\n";
        return(1);
    }

    cv::Mat matOriginal;
    cv::Mat matProcessed;

    std::vector<cv::Vec3f> vecCircles;
    std::vector<cv::Vec3f>::iterator itrCircles;

    cv::namedWindow("Original");
    cv::namedWindow("Processed");

    char charCheckForEscKey = 0;

    while (charCheckForEscKey != 27) {
        if (capWebcam.read(matOriginal) == NULL) {
            std::cout << "error: frame not read from webcam\n\n";
            break;
        }

        cv::inRange(matOriginal,
            cv::Scalar(0, 0, 175),
            cv::Scalar(100, 100, 256),
            matProcessed);

        cv::GaussianBlur(matProcessed,
            matProcessed,
            cv::Size(9, 9),
            1.5);

        cv::HoughCircles(matProcessed,
            vecCircles,
            CV_HOUGH_GRADIENT,
            2,
            matProcessed.rows / 4,
            100,
            50,
            10,
            400);

        for (itrCircles = vecCircles.begin(); itrCircles != vecCircles.end(); itrCircles++) {

            std::cout << "ball position x=" << (*itrCircles)[0]
                << ", y=" << (*itrCircles)[1]
                << ", z=" << (*itrCircles)[2] << "\n";

            cv::circle(matOriginal,
                cv::Point((int)(*itrCircles)[0], (int)(*itrCircles)[1]),
                3,
                cv::Scalar(0, 255, 0),
                CV_FILLED);

            cv::circle(matOriginal,
                cv::Point((int)(*itrCircles)[0], (int)(*itrCircles)[1]),
                (int)(*itrCircles)[2],
                cv::Scalar(0, 255, 0),
                3);
        }

        cv::imshow("Original", matOriginal);
        cv::imshow("Processed", matProcessed);

        charCheckForEscKey = cv::waitKey(10);
    }
    return(0);
}
4

0 回答 0