在c++中使用opencv捕获实时视频
Capturing real time video with opencv in c++?
我正在使用opencv和c++开发一个车牌号检测应用程序。
对于检测试验,我想使用VideoCapture()
功能从我的网络摄像头捕捉实时视频,如下所示:
int main(void)
{
// input image
cv::Mat imgOriginalScene;
cv::VideoCapture cap = cv::VideoCapture(0);
for (;;) {
cv::Mat frame;
cap.read(frame);
double timestamp = cap.get(CV_CAP_PROP_POS_MSEC);
if (cap.read(frame)) {
imgOriginalScene = frame;
cv::Size size(1000, 600);
resize(imgOriginalScene, imgOriginalScene, size);
if (imgOriginalScene.empty()) {
std::cout << "error: image not read from filenn";
return(0);
}
std::vector<PossiblePlate> vectorOfPossiblePlates =
detectPlatesInScene(imgOriginalScene);
vectorOfPossiblePlates = detectCharsInPlates(vectorOfPossiblePlates);
cv::imshow("imgOriginalScene", imgOriginalScene);
if (vectorOfPossiblePlates.empty()) {
std::cout << std::endl << "no license plates were detected" << std::endl;
}
else {
std::sort(vectorOfPossiblePlates.begin(), vectorOfPossiblePlates.end(),
PossiblePlate::sortDescendingByNumberOfChars);
// suppose the plate with the most recognized chars
// (the first plate in sorted by string length descending order)
// is the actual plate
PossiblePlate licPlate = vectorOfPossiblePlates.front();
cv::imshow("imgPlate", licPlate.imgPlate);
cv::imshow("imgThresh", licPlate.imgThresh);
// if no chars were found in the plate
if (licPlate.strChars.length() == 0) {
// show message
std::cout << std::endl << "no characters were detected" << std::endl << std::endl;
}
// draw red rectangle around plate
drawRedRectangleAroundPlate(imgOriginalScene, licPlate);
// write license plate text to std out
std::cout << std::endl << "license plate read from image = " << licPlate.strChars << std::endl;
std::cout << std::endl << "-----------------------------------------" << std::endl;
outfile << licPlate.strChars << " " << timestamp / 1000 << " Detik" << std::endl;
// write license plate text on the image
writeLicensePlateCharsOnImage(imgOriginalScene, licPlate);
// re-show scene image
cv::imshow("imgOriginalScene", imgOriginalScene);
// write image out to file
cv::imwrite("imgOriginalScene.png", imgOriginalScene);
}
cvWaitKey(34);
}
else {
cap.set(CV_CAP_PROP_POS_FRAMES, 1.0);
cvWaitKey(1000);
}
if (cap.get(CV_CAP_PROP_POS_FRAMES) == cap.get(CV_CAP_PROP_FRAME_COUNT)) {
break;
}
}
outfile.close();
// hold windows open until user presses a key
cv::waitKey(0);
return(0);
}
但在运行代码后,我的网络摄像头显示的视频被卡住了,就像它只显示了第一帧,然后就停止了。所以我检测不到任何东西,因为视频被卡住了。
有人面临同样的问题吗?
通常,从相机读取时,步骤如下:
- 打开cv::VideoCapture对象并调用
isOpened()
以验证是否成功打开。我通常更喜欢单独声明捕获对象,然后使用open(0)
打开它,但要测试什么对您有效 - 将帧读取到
cv::Mat
对象中。您可以使用read()
或使用<<
运算符执行进近 - 使用
empty()
验证帧是否为空 - 处理循环中的图像
使用waitKey()
请记住,waitKey(0)
将暂停您的程序,直到用户按下某个键。在循环结束时放置一次waitKey(30)
将显示使用imshow()
处理和排队的图像。您不需要在整个循环中多次使用waitKey()
,并且可能需要一些其他计时器来进行计时。
可能的错误点
您的代码可能挂在第一个if语句上。您正在背靠背调用cap.read(frame)
,可能速度太快,网络摄像头无法处理。。。导致它在第一次迭代之后返回false。相反,请尝试使用frame.empty()
来检查调用cap.read(frame)
后是否有要处理的映像的实现。
cv::Mat imgOriginalScene; // input image
cv::VideoCapture cap = cv::VideoCapture(0);
if(!cap.isOpened()){
cerr << "Error Opening Capture Device" << endl; //Use cerr for basic debugging statements
return -1;
}
for (;;) {
cv::Mat frame;
cap.read(frame);
double timestamp = cap.get(CV_CAP_PROP_POS_MSEC);
if (frame.empty()) {
/*... do something ...*/
}
else {
cap.set(CV_CAP_PROP_POS_FRAMES, 1.0);
cvWaitKey(1000);
}
//Try removing this for debug...
/*
if (cap.get(CV_CAP_PROP_POS_FRAMES) == cap.get(CV_CAP_PROP_FRAME_COUNT)) {
//break;
}
*/
cv::waitKey(0); // hold windows open until user presses a key
}
outfile.close();
cv::waitKey(0); // hold windows open until user presses a key
return(0);
更新日志:
- 根据@api55的评论,添加了isOpen()检查完整性
- 为waitkey()添加了讨论
- 建议评论掉目前打破循环的部分
相关文章:
- 如何使用OpenCV-C++编写*.mp4视频?
- 在本地网络中通过OpenCV(C++)实时流式传输图像
- OpenCV QT,显示视频的帧(不使用while循环)
- 在 openCV 中手动停止视频
- 完整Windows桌面的实时视频处理
- C++:灰度位图标题和实时绘画+opencv图像处理
- 如何从DJI Professional 3相机中播放实时视频
- 在c++中使用opencv捕获实时视频
- Qt:显示实时视频,一次一帧
- 使用OpenCv和多线程的IP摄像机实时视频馈送
- C++ ffmpeg 实时视频传输
- 实时视频捕获 c++ 库
- 检测实时视频上的冲浪点
- 实时视频上的霍夫线变换会导致断点
- 使用 Live555 从连接到 H264 编码器的 IP 摄像机流式传输实时视频
- Live555可在一个RTSP流中流式传输实时视频和音频
- 想要在OSX上的OpenCV中实时镜像视频,不知道从哪里开始
- Opencv/在线程中录制实时视频,在另一个线程中处理图像
- 转换实时视频帧灰度(OpenCV)
- 在Windows上通过Live555服务一个实时的OpenCV H.264流