C++ 在Mac mountain lion上运行open CV人脸检测时出现问题

C++ 在Mac mountain lion上运行open CV人脸检测时出现问题,c++,c,macos,opencv,C++,C,Macos,Opencv,我遇到了一个问题,标准的OpenCV人脸检测(facedetect)无法正常工作。网络摄像头灯亮起,但没有发生任何情况,程序启动时有一个小窗口,如下所示: 我在一家公司工作。以下是我所做的: 安装OpenCV并获取OpenCV源代码 brew tap homebrew/science brew install --with-tbb opencv wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4

我遇到了一个问题,标准的OpenCV人脸检测(
facedetect
)无法正常工作。网络摄像头灯亮起,但没有发生任何情况,程序启动时有一个小窗口,如下所示:

我在一家公司工作。以下是我所做的:

  • 安装OpenCV并获取OpenCV源代码

    brew tap homebrew/science
    brew install --with-tbb opencv
    wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.6/opencv-2.4.6.tar.gz
    tar xvzf opencv-2.4.6.tar.gz
    
  • 使用标准分类器运行
    facedetect
    样本

    cd ~/opencv-2.4.6/samples/c
    chmod +x build_all.sh
    ./build_all.sh
    ./facedetect --cascade="../../data/haarcascades/haarcascade_frontalface_alt.xml"
    
  • < >我可以修改C++示例代码并重新编译和运行,但我不知道这个问题是什么。 有人有什么建议吗

    更新问题是
    cvQueryFrame
    中的图像为空:

    IplImage* iplImg = cvQueryFrame( capture );
    frame = iplImg;
    if( frame.empty() ) 
    {
        cout << "FRAME EMPTY\n";  // This is getting logged
        break;
    }
    
    IplImage*iplImg=cvQueryFrame(捕获);
    帧=iplImg;
    if(frame.empty())
    {
    
    您可以尝试定位问题,您是否尝试从网络摄像头捕获图像并显示它,而不运行任何其他操作

    通过OpenCV从网络摄像头捕获图像似乎有问题,这种问题可能是硬件造成的,例如,在我的朋友macbook pro上捕获的图像是320x240,在我的朋友macbook pro上是640x480。我的朋友刚刚更改了摄像头设置的简单配置,他的问题就解决了。你的问题可能是我喜欢这样

    或者你可以试着用一些图像运行人脸检测仪,你需要更改代码,使它从你的磁盘加载一个图像,并尝试在上面检测人脸。如果它不起作用,我们可以说你的问题不是摄像头,而是更大的问题,或者如果它起作用,我们可以肯定地说问题是网络摄像头

    编辑


    如果您使用的是IplImage类型,请确保从相机获取多张图像,有时第一张图像是空的。

    您可以尝试定位问题,您是否尝试从网络摄像头捕获图像并显示它,而不运行任何其他操作

    通过OpenCV从网络摄像头捕获图像似乎有问题,这种问题可能是硬件造成的,例如,在我的朋友macbook pro上捕获的图像是320x240,在我的朋友macbook pro上是640x480。我的朋友刚刚更改了摄像头设置的简单配置,他的问题就解决了。你的问题可能是我喜欢这样

    或者你可以试着用一些图像运行人脸检测仪,你需要更改代码,使它从你的磁盘加载一个图像,并尝试在上面检测人脸。如果它不起作用,我们可以说你的问题不是摄像头,而是更大的问题,或者如果它起作用,我们可以肯定地说问题是网络摄像头

    编辑


    如果您使用的是IplImage类型,请确保从相机中获取多张图像,有时第一张图像是空的。

    这是由于OpenCV中的一个错误造成的-它已被修复(此处的错误报告),但homebrew/science中的版本来自修复之前

    您可以通过编辑opencv的brew公式(基于此请求)获得并安装更新版本

    编辑/usr/local/Library/Formula/opencv.rb,并替换以下行:

    url 'http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.6.1/opencv-2.4.6.1.tar.gz'
    sha1 'e015bd67218844b38daf3cea8aab505b592a66c0'
    
    用这些

    url 'https://github.com/Itseez/opencv/archive/2.4.7.1.tar.gz'
    sha1 'b6b0dd72356822a482ca3a27a7a88145aca6f34c'
    
    那就做吧

    brew remove opencv 
    brew install opencv
    
    在小牛身上工作(至少对我来说),应该在山狮身上工作

    更新:homebrew/science中的OpenCV版本现已更新,因此此答案现在已过时

    brew upgrade opencv
    

    将使homebrew获得最新版本,并带有固定的网络摄像头捕获。

    这是由于OpenCV中的一个错误导致的-它已被修复(此处的错误报告),但homebrew/science中的版本来自修复之前

    您可以通过编辑opencv的brew公式(基于此请求)获得并安装更新版本

    编辑/usr/local/Library/Formula/opencv.rb,并替换以下行:

    url 'http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.6.1/opencv-2.4.6.1.tar.gz'
    sha1 'e015bd67218844b38daf3cea8aab505b592a66c0'
    
    用这些

    url 'https://github.com/Itseez/opencv/archive/2.4.7.1.tar.gz'
    sha1 'b6b0dd72356822a482ca3a27a7a88145aca6f34c'
    
    那就做吧

    brew remove opencv 
    brew install opencv
    
    在小牛身上工作(至少对我来说),应该在山狮身上工作

    更新:homebrew/science中的OpenCV版本现已更新,因此此答案现在已过时

    brew upgrade opencv
    

    将使homebrew获得最新版本,并具有固定的网络摄像头捕获功能。

    很好的提示,我让好的老lena工作了!:)所以问题在于网络摄像头/硬件。您还记得您朋友更改设置配置的任何细节吗?很遗憾,我不记得了,但我认为您可以尝试使用外部网络摄像头?您需要做的一切将其从USB插入并更改代码,以便使用设备id 1而不是0(默认值)初始化
    cv::Capture
    我还发现了一个相机偏好,但不确定它是否会为你工作……我想说最后一件事,如果你不需要请不要使用旧的C API,使用更好的C++ API,甚至可以帮助你克服你的问题。<代码> CV::Mat框架;CV::捕获捕获(0)这是你从相机中获取图像所需的所有代码。这比使用<代码> IplImage < /C> >和 CVQueReals> < /C> >要好多了。希望你能很快地解决你的问题:)是的。如果你想要C++,API,你所使用的所有类都应该在OpenCV2下,而不是OpenCV。(我说的是include文件)。例如,
    #include
    。从您的帖子中可以清楚地看到您正在使用C API,因为您的路径是/opencv-2.4.6/samples/C,请尝试cpp而不是C。祝您好运:)很好的提示,我有很好的老lena在工作!:)所以问题在于网络摄像头/硬件。你还记得你朋友更改设置配置的任何细节吗?不幸的是,我不记得了,但我认为你可以尝试使用外部网络摄像头?你所需要做的就是从USB插入它并更改代码,以便初始化
    cV::用设备ID 1代替0(默认值)捕获.<代码>,我也发现了一个相机首选项,但不确定它是否会为你工作。我想说最后一件事,如果你不需要使用旧的C API,使用更好的C++ API,甚至可以帮助你克服你的问题。<代码> CV::Mat框架;CV::捕获CA