Hello,
For context I have a Jetson Xavier NX and a camera connected to it, the camera can easily reach 67 fps. I convert each of these frames to a cv::Mat, this conversion is fast enough and does not affect the overall program. Between each frame grab I have 14.8 ms to do whatever I want.
What I want to do is to write each one of these frames in my SSD to tag them latter. The frames are in grayscale so I’m saving them in .PGM, I choose this format becuase in a quick test of 100 frames cv::imwrite only took ~6ms to write each image.
The frames are grabed inside a while loop and each frame captured is sent to a image writer thread via a thread safe queue, this thread calls the cv::imwrite function to write the frame to the SSD.
With what I hope it’s enough context, here’s my problem:
While most frames are written to the SSD in ~6 ms, some frames take as long as 200ms and in some rare occasions even 5 seconds! Could you help me with this?
Also I did a quick test without threads saving an image 10000 times and still most images took ~6ms but some took >50 ms too.
Here’s the capture loop of my app.
while(1){
frame = camera.GrabFrame();
if(capture){
dst = fullpath + std::string("/") + std::to_string(i) + ".pgm";
resize(frame, scaledFrame, Size(1920,1080));
imageWriter.SaveImage(scaledFrame, dst);
i++;
}
if(killswitch){
break;
}
}
And here’s is the ImageWriter worker thread.
void ImageWriter::MainWorker(){
frameData frame_data;
std::chrono::steady_clock::time_point begin;
std::chrono::steady_clock::time_point end;
float timedif = 0;
while(true){
frame_data = DequeueFrame();
if(std::string("NULL").compare(frame_data.path) == 0){
break;
}
begin = std::chrono::steady_clock::now();
//std::cout << frame_data.path << std::endl;
imwrite(frame_data.path.c_str(), frame_data.frame);
end = std::chrono::steady_clock::now();
timedif = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count();
if(timedif > 8){
std::cout << "imwrite is taking to much time " << timedif << "\n";
}
}
std::cout << "Exit thread" << std::endl;
}