国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

VS+QT+Opencv使用YOLOv4對視頻流進行目標檢測

這篇具有很好參考價值的文章主要介紹了VS+QT+Opencv使用YOLOv4對視頻流進行目標檢測。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

對單張圖像的檢測,請參考:https://blog.csdn.net/qq_45445740/article/details/109659938文章來源地址http://www.zghlxwxcb.cn/news/detail-651739.html

#include <fstream>
#include <sstream>
#include <iostream>
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace dnn;
using namespace std;

// 初始化參數(shù)
float confThreshold = 0.5; // 置信度
float nmsThreshold = 0.4;  // NMS
int inpWidth = 416;  // 網(wǎng)絡輸入圖像的寬度
int inpHeight = 416; // 網(wǎng)絡輸入圖像的高度
vector<string> classes;

// 使用非最大值抑制去除低置信度的邊界框
void postprocess(Mat& frame, const vector<Mat>& out);

// 繪制預測的邊界框
void drawPred(int classId, float conf, int left, int top, int right, int bottom, Mat& frame);

// 獲取輸出層的名稱
vector<String> getOutputsNames(const Net& net);
void detect_image(string image_path, string modelWeights, string modelConfiguration, string classesFile);
void detect_video(string video_path, string modelWeights, string modelConfiguration, string classesFile);

int main(int argc, char** argv)
{
	// 給出模型的配置和權重文件
	String modelConfiguration = "E:/00000000E/QT/pracitce/PcbDetectv2/01圖像識別/model/yolo-obj.cfg";
	String modelWeights = "E:/00000000E/QT/pracitce/PcbDetectv2/01圖像識別/model/yolo-obj_4000.weights";
	string image_path = "E:/00000000E/QT/pracitce/PcbDetectv2/01圖像識別/image/01.jpg";
	string classesFile = "E:/00000000E/QT/pracitce/PcbDetectv2/01圖像識別/model/classes.names";// "coco.names";

	// detect_image(image_path, modelWeights, modelConfiguration, classesFile);
	string video_path = "E:/00000000E/QT/pracitce/PcbDetectv2/02視頻檢測/video/test.mp4";
	detect_video(video_path, modelWeights, modelConfiguration, classesFile);
	cv::waitKey(0);
	return 0;
}



void detect_image(string image_path, string modelWeights, string modelConfiguration, string classesFile) 
{
	// 加載分類類別
	ifstream ifs(classesFile.c_str());
	string line;
	while (getline(ifs, line)) classes.push_back(line);

	// 加載網(wǎng)絡
	Net net = readNetFromDarknet(modelConfiguration, modelWeights);
	net.setPreferableBackend(DNN_BACKEND_OPENCV);
	net.setPreferableTarget(DNN_TARGET_OPENCL);

	// 打開視頻文件或圖像文件或攝像機流
	string str, outputFile;
	cv::Mat frame = cv::imread(image_path);

	// Create a window
	static const string kWinName = "Deep learning object detection in OpenCV";
	namedWindow(kWinName, WINDOW_NORMAL);

	Mat blob;
	blobFromImage(frame, blob, 1 / 255.0, Size(inpWidth, inpHeight), Scalar(0, 0, 0), true, false);

	// 設置網(wǎng)絡輸入
	net.setInput(blob);

	// 運行前向傳遞以獲得輸出層的輸出
	vector<Mat> outs;
	net.forward(outs, getOutputsNames(net));

	// 移除低置信度的邊界框
	postprocess(frame, outs);

	// 返回推斷的總時間(t)和每個層的計時(以layersTimes表示)

	vector<double> layersTimes;
	double freq = getTickFrequency() / 1000;
	double t = net.getPerfProfile(layersTimes) / freq;
	string label = format("Inference time for a frame : %.2f ms", t);
	putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255));

	// 寫入帶有檢測框的幀
	imshow(kWinName, frame);
	cv::waitKey(30);
}


void detect_video(string video_path, string modelWeights, string modelConfiguration, string classesFile) 
{
	string outputFile = "./yolo_out_cpp.avi";;

	ifstream ifs(classesFile.c_str());
	string line;
	while (getline(ifs, line)) classes.push_back(line);

	Net net = readNetFromDarknet(modelConfiguration, modelWeights);
	net.setPreferableBackend(DNN_BACKEND_OPENCV);
	net.setPreferableTarget(DNN_TARGET_CPU);

	VideoCapture cap;

	Mat frame, blob;

	try 
	{
		// 打開視頻文件
		ifstream ifile(video_path);
		if (!ifile) throw("error");
		cap.open(video_path);
	}

	catch (...) 
	{
		cout << "Could not open the input image/video stream" << endl;
		return;
	}

	// Get the video writer initialized to save the output video
	//  video.open(outputFile, 
	//	VideoWriter::fourcc('M', 'J', 'P', 'G'), 28, Size(cap.get(CAP_PROP_FRAME_WIDTH), cap.get(CAP_PROP_FRAME_HEIGHT)));


	static const string kWinName = "Deep learning object detection in OpenCV";
	namedWindow(kWinName, WINDOW_NORMAL);

	while (waitKey(1) < 0)
	{
		cap >> frame;
		if (frame.empty()) 
		{
			cout << "Done processing !!!" << endl;
			cout << "Output file is stored as " << outputFile << endl;
			waitKey(3000);
			break;
		}

		blobFromImage(frame, blob, 1 / 255.0, Size(inpWidth, inpHeight), Scalar(0, 0, 0), true, false);

		net.setInput(blob);

		vector<Mat> outs;
		net.forward(outs, getOutputsNames(net));

		postprocess(frame, outs);

		vector<double> layersTimes;
		double freq = getTickFrequency() / 1000;
		double t = net.getPerfProfile(layersTimes) / freq;
		string label = format("Inference time for a frame : %.2f ms", t);
		putText(frame, label, Point(0, 15), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 255));

		Mat detectedFrame;
		frame.convertTo(detectedFrame, CV_8U);

		imshow(kWinName, frame);
	}

	cap.release();
}

void postprocess(Mat& frame, const vector<Mat>& outs)
{
	vector<int> classIds;
	vector<float> confidences;
	vector<Rect> boxes;
	for (size_t i = 0; i < outs.size(); ++i)
	{
		// 掃描網(wǎng)絡輸出的所有邊界框,只保留置信度高的邊界框。將盒子的類標簽指定為盒子得分最高的類
		float* data = (float*)outs[i].data;
		for (int j = 0; j < outs[i].rows; ++j, data += outs[i].cols)
		{
			Mat scores = outs[i].row(j).colRange(5, outs[i].cols);
			Point classIdPoint;
			double confidence;
			// 獲取最高分的值和位置
			minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);
			if (confidence > confThreshold)
			{
				int centerX = (int)(data[0] * frame.cols);
				int centerY = (int)(data[1] * frame.rows);
				int width = (int)(data[2] * frame.cols);
				int height = (int)(data[3] * frame.rows);
				int left = centerX - width / 2;
				int top = centerY - height / 2;

				classIds.push_back(classIdPoint.x);
				confidences.push_back((float)confidence);
				boxes.push_back(Rect(left, top, width, height));
			}

		}

	}

	// 執(zhí)行非最大抑制以消除置信度較低的冗余重疊框
	vector<int> indices;
	NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, indices);
	for (size_t i = 0; i < indices.size(); ++i)
	{
		int idx = indices[i];
		Rect box = boxes[idx];
		drawPred(classIds[idx], confidences[idx], box.x, box.y,
			box.x + box.width, box.y + box.height, frame);
	}

}


// 繪制預測框
void drawPred(int classId, float conf, int left, int top, int right, int bottom, Mat& frame)
{
	// 繪制顯示邊界框的矩形
	rectangle(frame, Point(left, top), Point(right, bottom), Scalar(255, 178, 50), 3);

	// 獲取類名及其置信度的標簽
	string label = format("%.2f", conf);
	if (!classes.empty())
	{
		CV_Assert(classId < (int)classes.size());
		label = classes[classId] + ":" + label;
	}

	// 在邊界框的頂部顯示標簽
	int baseLine;
	Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
	top = max(top, labelSize.height);
	rectangle(frame, Point(left, top - round(1.5 * labelSize.height)), Point(left + round(1.5 * labelSize.width), top + baseLine), Scalar(255, 255, 255), FILLED);

	putText(frame, label, Point(left, top), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 0), 1);
}

vector<String> getOutputsNames(const Net& net)
{
	static vector<String> names;
	if (names.empty())
	{
		// 獲取輸出層的索引,即輸出不相連的層
		vector<int> outLayers = net.getUnconnectedOutLayers();

		vector<String> layersNames = net.getLayerNames();

		names.resize(outLayers.size());
		for (size_t i = 0; i < outLayers.size(); ++i)
			names[i] = layersNames[outLayers[i] - 1];
	}
	return names;
}

到了這里,關于VS+QT+Opencv使用YOLOv4對視頻流進行目標檢測的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • OpenCV獲取網(wǎng)絡攝像頭實時視頻流

    參考文章: [常用工具] OpenCV獲取網(wǎng)絡攝像頭實時視頻流_opencv網(wǎng)絡攝像頭 [常用工具] OpenCV獲取網(wǎng)絡攝像頭實時視頻流_opencv網(wǎng)絡攝像頭_落痕的寒假的博客-CSDN博客 在使用OpenCv處理視頻時,無論是視頻文件還是攝像頭畫面,都要使用VideoCapture類來進行每一幀圖像的處理。當我們

    2024年02月01日
    瀏覽(101)
  • Opencv保存ESP32-CAM視頻流

    Opencv保存ESP32-CAM視頻流 esp32cam是一個很便宜的視頻模組,可以用作監(jiān)控等功能。此時就需要保存esp32的視頻流,方便查看等操作,python代碼如下 前置條件:視頻流正常,已安裝opencv

    2024年02月08日
    瀏覽(104)
  • opencv基本操作二(讀取視頻流與保存視頻、讀取攝像頭并保存視頻)

    opencv常用 讀視頻函數(shù) cv2.VideoCapture 、 cv2.VideoCapture.get 等,可以參考這里 opencv常用 寫視頻函數(shù) cv2.VideoWriter 等可以參考這里 ,其中視頻格式可以參考這里 videoCapture.read() 是按幀讀取視頻, ret,frame 是獲 .read() 方法的兩個返回值。其中 ret 是布爾值,如果讀取幀是正確的則返回

    2023年04月08日
    瀏覽(379)
  • Qt推流程序自動生成網(wǎng)頁遠程查看實時視頻流(視頻文件/視頻流/攝像頭/桌面轉成流媒體rtmp+hls+webrtc)

    Qt推流程序自動生成網(wǎng)頁遠程查看實時視頻流(視頻文件/視頻流/攝像頭/桌面轉成流媒體rtmp+hls+webrtc)

    推流程序將視頻流推送到流媒體服務器后,此時就等待驗證拉流播放,一般可以選擇ffplay命令行播放或者vlc等播放器打開播放,也可以選擇網(wǎng)頁直接打開拉流地址播放,一般主流的瀏覽器都支持網(wǎng)頁直接播放hls/m3u8/webrtc類型的視頻流,而且推流的主要目的可能就是為了能夠在

    2024年02月05日
    瀏覽(104)
  • 【精選】基于OpenCV的實時視頻流車牌識別(源碼&教程)

    【精選】基于OpenCV的實時視頻流車牌識別(源碼&教程)

    近年來,智能交通系統(tǒng)(ITS)在我國應用日益廣泛。作為ITS重要組成部分的自動車牌識別系統(tǒng)在交通流量檢測、交通誘導控制、違章車輛監(jiān)控等方面有著廣泛的應用,是確保道路安全暢通的重要手段,也為統(tǒng)計有關資料,為管理者決策提供有效數(shù)字依據(jù)的重要途徑。由于一般的識別系

    2024年01月23日
    瀏覽(94)
  • QT+ESP32-CAM上位機獲取視頻流(附源碼)

    QT+ESP32-CAM上位機獲取視頻流(附源碼)

    第二章 qt獲取esp32-cam視頻流 本文是基于esp32-cam 官方示例擴展的QT上位機程序 可以獲取視頻流來做一些圖像處理 幀率和直接用網(wǎng)頁打開的幀率差不多(25FPS) 由于也是剛玩ESP32-cam 在網(wǎng)上想找個QT上位機的程序來做一些測試 但是找到的一些例程獲取的幀率比較低所以開發(fā)了一個測

    2024年02月03日
    瀏覽(73)
  • 基于OpenCv+Django的網(wǎng)絡實時視頻流傳輸(前后端分離)

    基于OpenCv+Django的網(wǎng)絡實時視頻流傳輸(前后端分離)

    秋風閣——北溪入江流:https://focus-wind.com/ 秋風閣——基于OpenCv+Django的網(wǎng)絡實時視頻流傳輸(前后端分離) 使用OpenCv捕獲攝像機畫面后,我們有時候需要將畫面顯示在界面上。本博客基于Django的前后端分離模式,將視頻流從后端讀取,傳送給前端顯示。 在使用Django進行視頻

    2024年02月08日
    瀏覽(92)
  • 樹莓派學習:學習opencv+用opencv獲取樹莓派mjpg攝像頭視頻流

    目錄 前提步驟 打開樹莓派攝像頭 查看是否有圖像,登錄游覽器打開樹莓派IP地址的8080端口 獲取mjpg的視頻流url 代碼 先設定好mjpg的視頻流的url 利用opencv庫中的v2.VideoCapture類讀取mjpg視頻流? ?cv2.VideoCapture() 檢查攝像頭是否成功打開,如果沒有,則打印錯誤消息并退出程序?

    2024年02月03日
    瀏覽(98)
  • 一種在 Python 中實現(xiàn)更快 OpenCV 視頻流的多線程方法

    一種在 Python 中實現(xiàn)更快 OpenCV 視頻流的多線程方法

    概述 在本文中,我們將看到兩個沒有多線程的 Python 代碼示例,用于從攝像頭讀取視頻幀。我們將看到使用/不使用多線程獲得的 FPS 的差異。 什么是多線程? 線程是進程中的一個執(zhí)行單元。多線程是指通過在線程之間快速切換對 CPU 的控制(稱為上下文切換)來并發(fā)執(zhí)行多個

    2024年02月16日
    瀏覽(96)
  • C++&Python&C# 三語言OpenCV從零開發(fā)(4):視頻流讀取

    C++&Python&C# 三語言OpenCV從零開發(fā)(4):視頻流讀取

    C++PythonCsharp in OpenCV 專欄 【2022B站最好的OpenCV課程推薦】OpenCV從入門到實戰(zhàn) 全套課程(附帶課程課件資料+課件筆記) OpenCV 教程中文文檔|OpenCV中文 OpenCV教程中文文檔|W3Cschool OpenCV基礎教程——視頻的讀取與寫入(超詳細+附代碼) 我之前寫過一篇基于Python的,我現(xiàn)在重新寫一次

    2024年01月21日
    瀏覽(119)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包