使用 OpenCV 图像处理和修改功能来编辑具有过滤器和转换功能的图像,探索复杂的运动分析和面部标志检测算法,使用它们来构建安全和面部检测应用程序,在 OpenCV 和 GPU 中使用预训练的深度学习模型来快速过滤图像。
运动捕捉代码
#include <QTime>
#include <QDebug>
#include "utilities.h"
CaptureThread::CaptureThread(int camera, QMutex *lock):
running(false), cameraID(camera), videoPath(""), data_lock(lock)
{
fps_calculating = false;
fps = 0.0;
frame_width = frame_height = 0;
video_saving_status = STOPPED;
saved_video_name = "";
video_writer = nullptr;
motion_detecting_status = false;
}
CaptureThread::CaptureThread(QString videoPath, QMutex *lock):
running(false), cameraID(-1), videoPath(videoPath), data_lock(lock)
{
fps_calculating = false;
fps = 0.0;
frame_width = frame_height = 0;
video_saving_status = STOPPED;
saved_video_name = "";
video_writer = nullptr;
motion_detecting_status = false;
}
CaptureThread::~CaptureThread() {
}
void CaptureThread::run() {
running = true;
cv::VideoCapture cap(cameraID);
cv::Mat tmp_frame;
frame_width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
frame_height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
segmentor = cv::createBackgroundSubtractorMOG2(500, 16, true);
while(running) {
cap >> tmp_frame;
if (tmp_frame.empty()) {
break;
}
if(motion_detecting_status) {
motionDetect(tmp_frame);
}
if(video_saving_status == STARTING) {
startSavingVideo(tmp_frame);
}
if(video_saving_status == STARTED) {
video_writer->write(tmp_frame);
}
if(video_saving_status == STOPPING) {
stopSavingVideo();
}
cvtColor(tmp_frame, tmp_frame, cv::COLOR_BGR2RGB);
data_lock->lock();
frame = tmp_frame;
data_lock->unlock();
emit frameCaptured(&frame);
if(fps_calculating) {
calculateFPS(cap);
}
}
cap.release();
running = false;
}
void CaptureThread::calculateFPS(cv::VideoCapture &cap)
{
const int count_to_read = 100;
cv::Mat tmp_frame;
QTime timer;
timer.start();
for(int i = 0; i < count_to_read; i++) {
cap >> tmp_frame;
}
int elapsed_ms = timer.elapsed();
fps = count_to_read / (elapsed_ms / 1000.0);
fps_calculating = false;
emit fpsChanged(fps);
}
void CaptureThread::startSavingVideo(cv::Mat &firstFrame)
{
saved_video_name = Utilities::newSavedVideoName();
QString cover = Utilities::getSavedVideoPath(saved_video_name, "jpg");
cv::imwrite(cover.toStdString(), firstFrame);
video_writer = new cv::VideoWriter(
Utilities::getSavedVideoPath(saved_video_name, "avi").toStdString(),
cv::VideoWriter::fourcc('M','J','P','G'),
fps? fps: 30,
cv::Size(frame_width,frame_height));
video_saving_status = STARTED;
}
https://embed.notionlytics.com/wt/ZXlKM2IzSnJjM0JoWTJWVWNtRmphMlZ5U1dRaU9pSlhiRWhvWlV4VVQxbHNjMlZYV2tKbU9URndaU0lzSW5CaFoyVkpaQ0k2SW1JeFpqaGpPVEkxTldSa01EUTJZekZpWTJOaE0yTXhOVFEwTlRneE5qUTNJbjA9