当前位置: 首页 > news >正文

国内最有趣的网站重庆网站建设公司在线联系

国内最有趣的网站,重庆网站建设公司在线联系,win10电脑做网站,网络设计山西分公司前言 需求#xff1a; 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求#xff0c;之前就有做了#xff0c;但是由于出现了一个问题#xff0c;人家摄像头的帧率目前都可以达到60帧/s 了#xff0c;而我的程序…前言 需求 1、如何使用OpenCV捕抓Windows电脑上USB摄像头的流、 2、采用多线程 3、获知当前摄像头的帧率。 这个需求之前就有做了但是由于出现了一个问题人家摄像头的帧率目前都可以达到60帧/s 了而我的程序获取的却还只能获取20帧/s 那么肯定就是存在问题了。所以目前采用了一些办法进行解决能充分发挥其60帧/s 的优势并能打出帧率。下面开始详细阐述。 正文 一、环境 1、Win10 2、Qt 5.8.0 MSVC2015 3、OpenCV VS2015编译的 二、效果展示 三、关键代码 1、抓图线程 bool CCameraCaptureThd::Init() {int index 5;while (true){m_bInit m_capture.open(0cv::CAP_DSHOW, cv::CAP_ANY); // 打开默认摄像头m_capture.set(cv::CAP_PROP_FRAME_WIDTH, 1280);m_capture.set(cv::CAP_PROP_FRAME_HEIGHT, 720);m_capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc(M, J, P, G));if (m_bInit){return true;}else{index--;QThread::sleep(1);if (index 0){qDebug() -- Failed to initialize camera!;return false;}}}return true; }void CCameraCaptureThd::StartCapture() {m_bCapture true;double dExpore m_capture.get(cv::CAP_PROP_EXPOSURE);double dBrightness m_capture.get(cv::CAP_PROP_BRIGHTNESS);qDebug() --- dExpore:dExpore||dBrightness; }void CCameraCaptureThd::StopCapture() {m_bCapture false; }bool CCameraCaptureThd::SetCameraBrightness(const int _iBrightness) {bool bRet false;if (false m_capture.isOpened()){return bRet;}qDebug() --- CCameraCaptureThd::SetCameraBrightness _iBrightness:_iBrightness;bRet m_capture.set(cv::CAP_PROP_BRIGHTNESS, _iBrightness);double dBrightness m_capture.get(cv::CAP_PROP_BRIGHTNESS);qDebug() --- CCameraCaptureThd dBrightness:dBrightness;return bRet; }bool CCameraCaptureThd::SetCameraExposure(const int _iExposure) {bool bRet false;if (false m_capture.isOpened()){return bRet;}qDebug() --- CCameraCaptureThd::SetCameraExposure _iExposure:_iExposure;bRet m_capture.set(cv::CAP_PROP_EXPOSURE, _iExposure);double dExpore m_capture.get(cv::CAP_PROP_EXPOSURE);qDebug() --- CCameraCaptureThd dExpore:dExpore;return bRet; }void CCameraCaptureThd::run() {std::thread captureThread(CCameraCaptureThd::captureThreadFunc, this);captureThread.detach(); // 捕获线程独立运行while (!m_bExit){cv::Mat frame;{std::unique_lockstd::mutex lock(m_mtxQueue);if (m_frameQueue.empty()){m_cvQueue.wait(lock, [this] { return !m_frameQueue.empty() || m_bExit; });}if (m_bExit) break;frame m_frameQueue.front();m_frameQueue.pop();}if (!frame.empty()){processFrame(frame);calculateFps(); // 每处理一帧计算一次 FPS}} }void CCameraCaptureThd::captureThreadFunc() {while (!m_bExit){cv::Mat frame;if (m_capture.isOpened() m_bCapture){m_capture.read(frame);if (frame.empty() || !_CheckMat(frame)){if (!m_bWrongCamera){emit SIGNAL_CameraWrong();m_bWrongCamera true;}continue;}std::lock_guardstd::mutex lock(m_mtxQueue);if (m_frameQueue.size() m_maxQueueSize){m_frameQueue.pop(); // 丢弃旧帧}m_frameQueue.push(frame);m_cvQueue.notify_one();}QThread::msleep(m_iImageCaptureSleepTime);} }void CCameraCaptureThd::processFrame(const cv::Mat frame) {cv::Mat processedFrame;frame.copyTo(processedFrame);cv::cvtColor(processedFrame, processedFrame, cv::COLOR_BGR2RGB);cv::flip(processedFrame, processedFrame, 1); // Y 轴翻转QImage img QImage((uint8_t*)processedFrame.data, processedFrame.cols, processedFrame.rows, QImage::Format_RGB888).copy();//qDebug() --- processFrame:QDateTime::currentMSecsSinceEpoch();emit SIGNAL_UpdateRgbImage(img); }void CCameraCaptureThd::calculateFps() {m_frameCount;auto now std::chrono::steady_clock::now();double elapsedTime std::chrono::duration_caststd::chrono::milliseconds(now - m_startTime).count();if (elapsedTime 1000.0) // 每秒更新一次 FPS{m_currentFps m_frameCount * (1000.0 / elapsedTime);m_frameCount 0;m_startTime now;qDebug() Current FPS: m_currentFps;emit SIGNAL_FrameRate(m_currentFps);} }bool CCameraCaptureThd::_CheckMat(const cv::Mat mat) {return !mat.empty() mat.cols 0 mat.rows 0; }最关键的就是run里面的函数了。 四、遇到的问题 1、帧率怎么都上不去 解决方案更改了相机打开时的设置 更改成这样 m_bInit m_capture.open(0cv::CAP_DSHOW, cv::CAP_ANY); // 打开默认摄像头 m_capture.set(cv::CAP_PROP_FRAME_WIDTH, 1280); m_capture.set(cv::CAP_PROP_FRAME_HEIGHT, 720); m_capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc(M, J, P, G));如果是这样的帧率就会上不去 m_capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc(M, J, P, G)); m_bInit m_capture.open(0cv::CAP_DSHOW, cv::CAP_ANY); // 打开默认摄像头 m_capture.set(cv::CAP_PROP_FRAME_WIDTH, 1280); m_capture.set(cv::CAP_PROP_FRAME_HEIGHT, 720);通过查询问题的原因应该在 属性设置的顺序如何影响帧率 属性的优先级问题 摄像头通常优先处理某些属性。例如 分辨率 (FRAME_WIDTH, FRAME_HEIGHT) 是基础属性影响图像传感器的输出格式。编码格式 (FOURCC) 决定图像流的压缩方式。 如果先设置分辨率然后设置编码格式编码器会根据新分辨率重新调整帧率。反之如果先设置编码格式随后更改分辨率驱动可能无法实时适配导致性能下降。 驱动和硬件内部调整机制 摄像头驱动程序在每次设置参数时可能会重新协商帧率。例如 设置分辨率后驱动需要查询硬件支持的最大帧率。如果在分辨率设置之前先设置编码格式驱动可能会选择一个默认分辨率通常较低随后改变分辨率会导致帧率调整。 参数依赖性问题 某些参数依赖于其他参数。例如 不同的编码格式支持的最大帧率和分辨率是不同的。MJPGMotion JPEG通常支持高分辨率和高帧率但 YUV 格式可能性能较低。 初始化次序影响驱动的行为 驱动可能在第一次设置后锁定某些参数。如果设置顺序错误后续参数可能不会生效或需要额外的时间重新初始化。例如先设置编码格式再设置分辨率可能触发两次完整的驱动初始化。 正确的设置顺序建议 为了确保帧率最大化可以按照以下顺序设置参数 设置分辨率 首先设置分辨率 (FRAME_WIDTH 和 FRAME_HEIGHT)确保摄像头硬件和驱动调整到正确的传感器输出。 设置帧率如果需要 如果特定帧率是关键要求可以尝试显式设置帧率cv::CAP_PROP_FPS。 设置编码格式 最后设置编码格式 (FOURCC)以确保基于之前设置的分辨率和帧率进行编码。 还有另一个原因就是我抓图与处理的线程处于同一个这样也会拉低整个线程处理的效率。 2、调整USB摄像头的亮度与曝光出现意外情况 若不按照先调曝光再调增益的顺序有可能出现调整曝光错乱的情况原因未知。 目前按照的逻辑是若想亮起来则为曝光0 亮度64 若想暗下来则为曝光-13 亮度:-64 五、资源 https://github.com/calorsol/QtDemo/tree/master/OpenCVCaptureTest 参考
http://www.w-s-a.com/news/101558/

相关文章:

  • 购物网站开发需要什么技术怎么查看网站是否备案
  • 学做电商那个网站好网站建设投票主题
  • 中卫网站推广网络营销毕业设计做网站大小有什么要求
  • 做问卷网站义乌网站建设推广专家
  • 不会编程怎样建设网站昆明做网站哪家
  • 直播网站模板新营销平台电商网站
  • 建设部指定招标网站免费的企业查询软件
  • 做前端常用的网站及软件下载平台优化是什么意思
  • 企石镇仿做网站wordpress 网站白屏
  • 班级网站建设规划书专业定制网红变色杯
  • 上海网站设计公司电话甘肃路桥建设集团有限公司官方网站
  • 哈尔滨网站建设网站开发陕西省建设监理工程协会网站
  • 微信公众号电商网站开发wordpress增加论坛
  • 网站建设视频百度网盘下载免费wordpress搭建
  • 哈尔滨市网站建设公司汕头市公司网站建设平台
  • 东莞网站建设方案外包甘肃两学一做网站
  • 网站建设优化排名推广平面设计职业学校
  • 网后台的网站怎么做网站代理商
  • 网站如何转移到新的空间服务器上手机无人区离线地图app
  • 网站建设模板的买域名做网站的坏处
  • 长春做网站qianceyun做景观素材有哪几个网站
  • 自己建的网站也要注册域名吗邯郸市做网站
  • 天津网站建设制作软件潍坊个人做网站
  • 重庆城市建设集团官方网站php用什么做网站服务器
  • 深圳坪山站重庆市园林建设有限公司网站
  • 网站建设图片教程如何用自己的电脑建网站
  • 《网页设计与网站建设》A卷答案广东新闻联播
  • 海南专业网站运营托管wordpress 去掉主题
  • 企业品牌网站制作甜品制作网站
  • 手机网站怎么制作影响力网站建设