2017-01-03 2 views
1

Мне нравится делать снимки с использованием RPi не менее 60 Гц. Мой код находится в C++, и у нас есть библиотека here для интерфейса C++. Но эта библиотека имеет максимум 30 Гц. Моя цель минимальная 60 Гц. Пока что я нашел raspistill может сделать до 90 Гц, поэтому я пытаюсь связать свою программу на C++ с кодом raspistill. Я нашел одну библиотеку здесь PiCam, которая имеет прямой интерфейс для raspistll. Не очень уверен, он может пойти на 60 Гц, я все еще пытаюсь проверить его и иметь несколько проблем. Мои запросы:Чтение изображения камеры с использованием raspistill из программы на C++

(1) Как возможно иметь 60 Гц fps при RPi с использованием C++?

(2) Чтобы взаимодействовать с PiCam, я уже скомпилировал, построил и установил библиотеку без проблем. Но я получаю черное изображение, когда снимаю. В чем может быть проблема? Часть моего кода показана ниже.

CCamera* cam = StartCamera(640, 480,60,1,true); 
    char mybuffer[640 * 480 * 4]; 
    int ret = cam->ReadFrame(0, mybuffer, sizeof(mybuffer)); 
    cout << " ret " << ret << endl; 
    Mat img(480, 640, CV_8UC4,mybuffer); 
    imwrite("img.jpg", img); 

img.jpg помещен в черный цвет.

(3) Использование PiCam, как можно изменить изображение серого?

ответ

2

Я использую Raspicam от here на малине Pi 3 и обходим около 90 кадров в секунду в черно-белом режиме.

В настоящее время я повторно назначаю код для чего-то еще, поэтому он не на 100% идеален для ваших нужд, но должен вас поймать.

#include <ctime> 
#include <fstream> 
#include <iostream> 
#include <raspicam/raspicam.h> 
#include <unistd.h> // for usleep() 

using namespace std; 

#define NFRAMES 1000 
#define WIDTH 1280 
#define HEIGHT 960 

int main (int argc,char **argv) { 

    raspicam::RaspiCam Camera; 
    // Allowable values: RASPICAM_FORMAT_GRAY,RASPICAM_FORMAT_RGB,RASPICAM_FORMAT_BGR,RASPICAM_FORMAT_YUV420 
    Camera.setFormat(raspicam::RASPICAM_FORMAT_GRAY); 

    // Allowable widths: 320, 640, 1280 
    // Allowable heights: 240, 480, 960 
    // setCaptureSize(width,height) 
    Camera.setCaptureSize(WIDTH,HEIGHT); 

    // Open camera 
    cout<<"Opening Camera..."<<endl; 
    if (!Camera.open()) {cerr<<"Error opening camera"<<endl;return -1;} 

    // Wait until camera stabilizes 
    cout<<"Sleeping for 3 secs"<<endl; 
    usleep(3000000); 
    cout << "Grabbing " << NFRAMES << " frames" << endl; 

    // Allocate memory for camera buffer 
    unsigned long bytes=Camera.getImageBufferSize(); 
    cout << "Width: " << Camera.getWidth() << endl; 
    cout << "Height: " << Camera.getHeight() << endl; 
    cout << "ImageBufferSize: " << bytes << endl;; 
    unsigned char *data=new unsigned char[bytes]; 

    for(int frame=0;frame<NFRAMES;frame++){ 
     // Capture frame 
     Camera.grab(); 

     // Extract the image 
     Camera.retrieve (data,raspicam::RASPICAM_FORMAT_IGNORE); 
     } 
    } 
    return 0; 
} 

Кстати, она работает очень хорошо с CImg.

Кроме того, у меня еще не было времени, чтобы узнать, работает ли он быстрее, чтобы создать новый поток для обработки каждого фрейма или начать несколько потоков в начале и использовать переменную условия для запуска после получения каждый кадр.

+0

Да, в настоящее время я использую эту библиотеку, и она имеет максимальную частоту кадров 30 Гц. Вы тестировали, чтобы иметь 90 Гц fps? Конфигурация для настройки fps отсутствует. Моя обработка изображений занимает около 10 мс, поэтому, если я прочитаю изображение из файла, я могу достичь до 100 Гц. Но я использую эту библиотеку для размера кадра 640 x 480, я могу иметь максимум 30 Гц. Так что чтение из камеры является узким местом для меня. Как установить более высокие значения fps с помощью этого lbrary? – batuman

+0

Я могу читать 90 + fps. Я не устанавливаю скорость, я просто читаю фреймы как можно быстрее. Попробуйте прочитать 1000 кадров и измерить время, а затем вычесть время стабилизации 3 секунды. Я получил около 14 секунд. –

+0

Спасибо, я буду реализовывать потоки, разделяя поток чтения и обработки потока. – batuman

0

Ответы Марка Сетчелла верны.

Но я выяснил, что параметр настройки частоты кадров не отображается на уровне API и не может установить частоту кадров. Частота кадров по умолчанию составляет 30 Гц. Можно изменить его в файле src/private/private_impl.cpp. Я установил 60 Гц, и теперь он работает.

Смежные вопросы