Я создаю приложение C ++ для записи изображений с помощью камеры, используя библиотеку Spinnaker. Чтобы улучшить производительность, я решил временно сохранить изображения в векторе и сохранить их потом. Но так как я решил сохранить их после, все изображения идентичны (несмотря на то, что камера все еще движется), и я не понимаю, почему …
Вот упрощенная версия моего кода:
CameraPtr pCam = camList.GetByIndex(0);
unsigned int imageCnt = 0;
pCam->BeginAcquisition();
vector<ImagePtr> images;
QTime t_end = QTime::currentTime();
t_end = t_end.addSecs(sb_duration->value());
while (QTime::currentTime() < t_end) {
ImagePtr pResultImage = pCam->GetNextImage();
images.push_back(pResultImage);
pResultImage->Release();
}
for (unsigned int i = 0; i < images.size(); i++)
{
ostringstream filename;
filename << s_folder << "/Image #" << i << ".jpg";
ImagePtr pResultImage = images[i];
pResultImage->Save(filename.str().c_str());
i_progress = ((double) i / imageCnt) * 50 + 50;
p_progress->setValue(i_progress);
qInfo() << "Image #" << i << "saved.";
}
pCam->DeInit();
Как я прокомментировал ранее в комментарии, и после проверки немного документация, ImagPtr — это «умный указатель» для управления ресурсом Образ в вашем коде. Но когда вы пишете эту строку pResultImage->Release();
Вы непосредственно стираете изображение, поэтому вы его потеряли.
Я рекомендую вам удалить эту строку и не выпускать изображение, а затем вы можете увидеть изображение, которое вы храните в векторе.
Решением было использовать функцию DeepCopy:
while (QTime::currentTime() < t_end) {
ImagePtr pResultImage = pCam->GetNextImage();
ImagePtr pCopyImage = Image::Create();
pCopyImage->DeepCopy(ip_ResultImage);
images.push_back(pCopyImage);
pResultImage->Release();
}