Я использую 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
Задача ещё не решена.
Других решений пока нет …