Зачем моей программе OpenCV на BeagleBone Black делать такие изображения?

Вот ссылка на тип изображений, которые создает моя программа: https://imgur.com/a/vibBx#0

Я пробую написанную мною простую программу тестирования захвата. Я пытаюсь захватить изображения в цикле и сохранить их на доске с правильными номерами. Первый захват иногда бывает поврежден, а последующие захваты представляют собой смесь двух изображений. Я также заметил, что иногда верхняя половина изображения получается из предыдущего захвата, а нижняя половина - из этого цикла. Подробности и код я привел ниже.

OpenCV 2.4.2, работающий на BeagleBone Black с Ангстрём установлен на нем. Камера, подключенная к USB-порту BeagleBone Black, - Logitech C920. Камера подключается к BeagleBone Black перед включением питания через блок питания 5 В и подключением 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;
}

Где я могу ошибиться?

Вопрос о переполнении стека BeagleBone, OpenCV и проблема веб-камеры в некоторой степени имеет аналогичную проблему. Но переустановка ОС будет моим последним вариантом.


person sudhir vyasaraja    schedule 25.10.2013    source источник


Ответы (1)


Это странно, в любом случае попытайтесь вывести захват из цикла do-while, возможно, открытие и освобождение устройства захвата каждый раз не даст камере достаточно времени для подготовки буферов изображения.

person waleedq    schedule 05.12.2013
comment
Конечно. Инициализация камеры должна выполняться вне цикла. Зависит от инициализации драйвера (если камера будет повторно инициализироваться каждый раз), но в основном камере требуется некоторое время, чтобы начать работу. - person f4f; 04.07.2019