I have been developing an object tracking application with OpenCV 4.3.0 and C++.
I am using an actively cooled Raspberry Pi 4 2GB RAM and the HQ camera module.
Twice when I ran the program, I received the following error:
[ WARN:0] global /home/pi/opencv/modules/videoio/src/cap_v4l.cpp (1004) tryIoctl VIDEOIO(V4L2:/dev/video0): select() timeout.
I read from various other posts that the bandwidth could be a problem, but I don't understand why this would be so, if the HQ camera can do 0.7MP video @ 120FPS, while my program only seems to be 640 x 480 at almost 120FPS?
Here is the code for reference:
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/core/ocl.hpp>
using namespace cv;
using namespace std;
// Convert to string
#define SSTR( x ) static_cast< std::ostringstream & >( \
( std::ostringstream() << std::dec << x ) ).str()
int main(int argc, char **argv)
{
// Read video
VideoCapture video("/dev/video0");
// Exit if video is not opened
if(!video.isOpened())
{
cout << "Could not read video file" << endl;
return 1;
}
Mat frame;
video.read(frame);
while(video.read(frame))
{
// Start timer
double timer = (double)getTickCount();
GaussianBlur(frame, frame, Point(5, 5), 0);
Mat hsv;
cvtColor(frame, hsv, COLOR_BGR2HSV);
inRange(hsv, Scalar(22, 100, 100), Scalar(37, 255, 255), frame);
erode(frame, frame, Mat(), Point(-1, -1), 2);
dilate(frame, frame, Mat(), Point(-1, -1), 2);
// Calculate Frames per second (FPS)
float fps = getTickFrequency() / ((double)getTickCount() - timer);
// Display FPS on frame
putText(frame, "FPS : " + SSTR(int(fps)), Point(100,50), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50,170,50), 2);
// Display frame.
imshow("Tracking", frame);
// Exit if ESC pressed.
int k = waitKey(1);
if(k == 27)
{
break;
}
}
}