0

这是我的程序生成的图像类型的链接:http: //imgur.com/a/vibBx#0

我正在尝试我编写的一个简单的捕获测试程序。我正在尝试循环捕获图像并将它们保存到正确编号的板上。第一次捕获有时会损坏,随后的捕获是两个图像的混合。我还观察到,有时图像的上半部分来自上一次捕获,而下半部分是来自该循环的捕获。我已经在下面给出了详细信息和代码。

OpenCV 2.4.2 在安装了Ångström的BeagleBone Black上运行。插入 BeagleBone Black 的 USB 的摄像头是罗技 C920。相机先连接到 BeagleBone Black,然后通过 5 V 电源供电并将 BeagleBone Black 连接到笔记本电脑。通过PuTTY访问。

代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <string>
#include <unistd.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <cxcore.h>
#include "LaserWeed.h"
#include "SimpleGPIO.h"

using namespace cv;

int main(int argc, char* argv[])
{
    int i=0, a;
    string name;
    int length;
    char c, Filename[10000];
    CvCapture* capture = NULL;
    IplImage* img = NULL;

    do
    {
        //I am not sure if this is necessary, but I tried anyway
        //to see if it makes a difference since upper half of
        //image was from previous cycle.
        capture = NULL;
        img = NULL;

        //Converting Numbers to string to save with proper name
        std::stringstream ss;
        ss << i;
        name = ss.str();
        name = name + ".jpg";
        length = name.size();
        for(a=0; a<length; a++)
        {
            Filename[a] = name[a];
        }

        capture = cvCaptureFromCAM(-1);
        if (!capture)
        {
            fprintf( stderr, "ERROR: capture is NULL \n" );
            getchar();
            return -1;
        }
        img = cvQueryFrame(capture);
        if (!img)
        {
            fprintf(stderr, "ERROR: img is null...\n");
            getchar();
            return -1;
        }

        cvSaveImage(Filename,img);
        cvReleaseCapture(&capture);
        cvReleaseImage(&img);

        i++;
        c = getchar();
    }
    while (c!='e')
        ;
    return 0;
}

我可能哪里出错了?

Stack Overflow 问题BeagleBone、OpenCV 和网络摄像头问题有些类似的问题。但重新安装操作系统将是我的最后选择。

4

1 回答 1

0

这很奇怪,无论如何尝试将捕获从do-while循环中取出,也许每次打开和释放捕获设备都不会给相机足够的时间来准备它的图像缓冲区。

于 2013-12-05T06:11:43.330 回答