gpt4 book ai didi

c++ - 在 C++ 中使用 opencv 捕获实时视频?

转载 作者:行者123 更新时间:2023-11-28 04:55:07 26 4
gpt4 key购买 nike

我正在使用 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 file\n\n";
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);
}

但是在运行代码之后,我的网络摄像头显示的视频卡住了,就像它只显示了第一帧然后停止了。所以我无法检测到任何东西,因为视频卡住了。

有人遇到同样的问题吗?

最佳答案

通常,当从相机读取时 steps are as follows :

  1. 打开 cv::VideoCapture 对象并调用 isOpened()验证打开成功。我通常更喜欢单独声明捕获对象,然后使用 open(0)打开它,但测试什么对你有用。
  2. 将一帧读入 cv::Mat目的。您可以使用 read()或者您可以使用 << 实现接近运算符(operator)
  3. 使用 empty() 验证框架不为空.
  4. 在循环中处理图像。

使用 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 的评论,添加了 isOpened() 检查完整性
  • 添加了对 waitkey() 的讨论
  • 建议暂时将打破循环的部分注释掉

关于c++ - 在 C++ 中使用 opencv 捕获实时视频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47323019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com