обработка изображений — Raspicam и C ++: камера не восстанавливается должным образом после вызова release ()

Я использую c ++ и raspicam для съемки изображения, когда в значениях пикселей изображения выполняются определенные условия. Когда выполняются условия, я освобождаю камеру в коде c ++, вызываю сценарий bash, который вызывает raspistill, а затем снова открываю камеру после завершения сценария bash.

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

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

Для справки, я на Raspbian 8 (Джесси) и использую камеру Raspberry Pi NoIR V2.

Вот мой основной метод, включая основной цикл обработки:

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

raspicam::RaspiCam Camera = init_camera();
// Allocate memory for camera buffer
int bytes = Camera.getImageTypeSize ( raspicam::RASPICAM_FORMAT_GRAY );
unsigned char *data=new unsigned char[bytes];

unsigned int sum = 0;
int consec_pass = 0;
int finger_cnt = 0;

// main processing loop
while (true)
{
// Capture frame
Camera.grab();

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

int dmin = 255;
int dmax = 0;
int nmin = 0;
int nmax = 0;
for (int i = 0; i < bytes; i++)
{
if (data[i] < dmin)
dmin = data[i];
if (data[i] > dmax)
dmax = data[i];
}
for (int i = 0; i < bytes; i++)
{
if (data[i] < dmin + 5)
nmin++;
if(data[i] > dmax - 5)
nmax++;
}

cout << "nmin, nmax, dmin, dmax " << nmin << nmax << dmin << dmax << "\n";
if ((nmin > NMIN_THRESH) && (nmax > NMAX_THRESH) && (dmin < MIN_THRESH) && (dmax < MAX_THRESH))
consec_pass++;
else
consec_pass = 0;
if (consec_pass > CONSEC_THRESH)
{
finger_cnt++;
cout << "FOUND FINGER! " << finger_cnt << "\n";
cout<<"Closing camera and calling bash script to take image... \n";
Camera.release();
std::string script_str ( "~/GetImage.sh ");
std::string num_str(std::to_string(finger_cnt));
system((script_str + num_str).c_str());
cout<<"Done! Reinitializing camera";
Camera = init_camera();
consec_pass = 0;
}
}

А вот и метод init_camera (), на который ссылаются

raspicam::RaspiCam init_camera(){

raspicam::RaspiCam cam;
cam.setFormat(raspicam::RASPICAM_FORMAT_GRAY);
cam.setExposure(raspicam::RASPICAM_EXPOSURE_NIGHT);

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

// Wait until camera stabilizes
cout<<"Sleeping for 1 secs"<<endl;
usleep(1000000);

cout<<"Jogging the camera";

int bytes = cam.getImageTypeSize ( raspicam::RASPICAM_FORMAT_GRAY );
unsigned char *data=new unsigned char[bytes];

for (int i = 0; i < 5; i++)
{
// Capture frame
cam.grab();

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

И, наконец, вот скрипт bash, который я использую (всего одна строка)

raspistill -w 400 -h 300 -co 75 -sh 100 -e png -roi 0.0,0.0,0.85,0.85 -t 2000 -o fingerprint$1.png

Извините за грязное форматирование, не могу заставить его копировать прямо из gedit

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]