【问题标题】:OpenCV Capture from Camera Results in Noisy-like Image从相机捕获的 OpenCV 会产生类似嘈杂的图像
【发布时间】:2013-05-16 06:41:57
【问题描述】:

我在嵌入式目标板上使用 OpenCV(FriendlyARM mini6410,处理器臂 1176,运行 linux 内核 2.6.38)。 我使用为开发板提供的工具链编译 OpenCV 2.4.4 库,在 ftp 中找到(请参阅 FriendlyARM 的website)。我禁用了 GTK、ffmpeg 并启用了 v4l。库编译成功。

然后我写代码:

#include <opencv.hpp>
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

int main()
{
    int i;
    cout << "initialise" << endl;
    IplImage* img=0;
    cout << "capturing ..." << endl;
    CvCapture* capture = cvCaptureFromCAM(2);
    cout << "get here" << endl;
    if(!capture){
        cout << "not capture" << endl;
        return -1;
    }
    cout << "captured" << endl;
    img=cvQueryFrame(capture);

   IplImage* img1 = cvCreateImage(cvGetSize(img),8,3);
   // cvCvtColor(img,img1,CV_RGB2GRAY);
   cvCopy(img, img1);
   cvSaveImage("cam_snap.jpg",img1);
   cvReleaseImage( &img1 );
   cvReleaseImage( &img );
   cvReleaseCapture( &capture );
   cout << "exit" << endl;

   return 0;
}

代码构建成功。我在目标板上运行 .elf 可执行文件,连接到相机(PS3 眼睛),但生成的图像看起来像一台坏掉的电视(类似噪音):

在我的主机中,生成的图像与预期的一样(镜头前的场景)。您能否就出了什么问题或我应该从哪里开始调试提供建议?

【问题讨论】:

  • 简单的 v4l2-capture 效果好吗?尝试从 v4l2 包运行一个简单的示例。 v4l2-ctl 说了什么?
  • 嗯,我将 OpenCV 安装为静态库,而我认为 v4l 包在我的目标中不能作为可执行命令使用。我尝试运行 v4l2-ctl 命令,但目标返回“bin/sh:v4l2-ctl:未找到”。没有可用的 v4l 相关命令。

标签: opencv image-processing cross-compiling image-capture v4l


【解决方案1】:

您应该检查您的深度和渠道。这可能是对齐问题,此外请注意您的图像可能是 BGR 而不是 RGB。 你应该在 C++ 中使用 cv::Mat 而不是 IplImage 和 VideoCapture 而不是 CVCapture。

这个代码示例应该可以工作。 (未在与您相同的拱门上进行测试)

#include <opencv.hpp>
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

int main()
{
    VideoCapture capture = cv::VideoCapture(0);
    cout << "get here" << endl;
    if(!capture.isOpened())  // check if we succeeded                                                                                                   
         return -1;

    cout << "captured" << endl;
    Mat img;
    capture >> img;
    imwrite("./test.png", img);
    capture.release();
    cout << "exit" << endl;
    return 0;
}

希望对您有所帮助。

【讨论】:

  • 您好,感谢您的代码。但是我在目标上试了一下,结果还是很吵。到目前为止,我猜测故障出在 v4l 库(静态链接到 opencv 库)或 USB 接口(mini6410 在全速 USB 上运行,而 PS3 eye 是严格的高速 USB - [本文](codelaboratories.com/research/view/…)) .第二次诊断似乎在逻辑上可以理解并且更容易尝试,但目前还没有任何 USB 网络摄像头 :( 如果有新发现会报告!
【解决方案2】:

好的,确认。 mini 6410 运行 USB 1.0,而 ps3 eye 需要 USB 2.0。我使用标准网络摄像头(中国产品,itech pc 摄像头)尝试了该程序,效果非常好。保存的图像显示相机前的场景

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多