当图像像素值中遇到某些条件时,我正在使用 c++ 和 raspicam 拍摄图像。当条件满足时,我在 c++ 代码中释放相机,调用调用 raspistill 的 bash 脚本,然后在 bash 脚本完成后重新打开相机。
不幸的是,当我重新打开相机时,我从相机中检索到的数据停留在与释放相机之前的最后一帧相同的状态。我什至尝试在我的初始化方法中让相机慢跑几帧,但没有骰子。我所有计算的图像值在它工作一次后都停留在同一个值上。
有没有人遇到过这个问题?我知道我可以通过让 c++ 程序在找到我正在寻找的内容时退出并将其包装在 bash 脚本中的 while 循环来解决它,但这让我很困扰。
作为参考,我在 Raspbian 8 (jessie) 上并使用 A Raspberry Pi NoIR Camera 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 完全正确地复制它