OpenCV 學習探秘之三:從圖像讀取到特征識別,再到機器學習等函數接口的全面實戰應用與解析

一、引言

1.1介紹

OpenCV(Open Source Computer Vision Library)是一個功能強大的開源計算機視覺庫,廣泛應用于圖像和視頻處理、目標檢測、機器學習等領域。本文將全面解析 OpenCV 中常用的函數接口,幫助讀者快速掌握 OpenCV 的核心功能。
本文將按照功能模塊分類,詳細介紹 OpenCV 中的各類函數接口,并提供豐富的 C++ 代碼示例。內容涵蓋圖像讀取與顯示、圖像處理、特征提取、視頻處理、機器學習等多個方面。

1.2 準備

  • 開發環境:
    Qt5.14.2;OpenCV4.5.4
    附:點擊下載本文所用例子中使用的OpenCV4.5.4版本編譯好的庫
  • 引入依賴庫
INCLUDEPATH += "D:/opencv/opencv-4.5.4/build/include"
INCLUDEPATH += "D:/opencv/opencv-4.5.4/build/include/opencv2"
DEPENDPATH += "D:/opencv/opencv-4.5.4/build/x64/vc15/lib"
LIBS += "D:/opencv/opencv-4.5.4/build/x64/vc15/lib/opencv_world454d.lib"
  • 引入頭文件
//引入opencv頭文件和命名空間
#include <opencv.hpp>
using namespace cv;

附帶說明:后面的特征提取如SURF算法等高階調用,要依賴帶有opencv_contrib模塊的opencv庫,并添加頭文件

//引入頭文件和命名空間,在opencv_contrib模塊里
#include <opencv2/xfeatures2d.hpp>
using namespace cv::xfeatures2d;

二、OpenCV 基礎:圖像讀取、顯示與保存

2.1 圖像讀取:imread 函數

imread函數用于從文件中讀取圖像,支持多種圖像格式,如 JPEG、PNG、BMP 等。

//圖像讀,顯示,寫
void MainWindow::on_bt1_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug() << QString("無法讀取圖像!");return;}imshow(QString("TestSrc").toStdString(), image);// 修改圖像(例如,轉換為灰度圖)Mat grayImage;cvtColor(image, grayImage, COLOR_BGR2GRAY);// 保存圖像bool saved = imwrite("gray_test.jpg", grayImage);imshow(QString("TestDsc").toStdString(), grayImage);if (saved) {qDebug()  << QString("圖像保存成功!");} else {qDebug()  << QString("圖像保存失敗!");}return;
}

imread函數的第二個參數是一個標志,指定圖像的讀取方式:

  • IMREAD_COLOR:讀取彩色圖像,忽略透明度(默認值);
  • IMREAD_GRAYSCALE:以灰度模式讀取圖像;
  • IMREAD_UNCHANGED:讀取包含 Alpha 通道的圖像

測試結果:
在這里插入圖片描述

2.2 圖像顯示:imshow 和 namedWindow 函數

imshow函數用于在窗口中顯示圖像,而namedWindow函數用于創建一個窗口。

    QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 創建窗口namedWindow(QString("TestSrc").toStdString(), WINDOW_AUTOSIZE); // 創建一個自動調整大小的窗口// 顯示圖像imshow(QString("TestSrc").toStdString(), image);// 等待按鍵事件waitKey(0); // 0表示無限等待,直到用戶按下任意鍵return;
}

namedWindow函數的第二個參數可以是:

  • WINDOW_AUTOSIZE:窗口大小自動適應圖像大小
  • WINDOW_NORMAL:窗口大小可手動調整

在這里插入圖片描述

2.3 圖像保存:imwrite 函數

imwrite函數用于將圖像保存到文件中。

//測試寫入
void MainWindow::on_bt3_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 修改圖像(例如,轉換為灰度圖)Mat grayImage;cvtColor(image, grayImage, COLOR_BGR2GRAY);// 保存圖像bool saved = imwrite("gray_test.jpg", grayImage);if (saved) {qDebug()  << QString("圖像保存成功!");} else {qDebug()  << QString("圖像保存失敗!");}return;
}

mwrite函數的第二個參數是要保存的圖像,第三個參數是一個可選的參數向量,用于指定特定格式的保存選項。
在這里插入圖片描述

三、圖像處理:濾波、邊緣檢測與形態學操作

3.1 圖像濾波:平滑與降噪

圖像濾波是圖像處理中常用的操作,用于平滑圖像、降噪或增強特定特征。

3.1.1 均值濾波:blur 函數

均值濾波是一種簡單的線性濾波方法,它用鄰域內像素的平均值代替中心像素的值。

//均值濾波
void MainWindow::on_bt4_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 均值濾波Mat blurredImage;blur(image, blurredImage, Size(5, 5)); // 5x5的均值濾波器// 顯示原始圖像和濾波后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc").toStdString(), blurredImage);waitKey(0);return;
}

在這里插入圖片描述

3.1.2 高斯濾波:GaussianBlur 函數

高斯濾波是一種常用的線性濾波方法,它用高斯核來對圖像進行卷積,能夠有效抑制高斯噪聲。

    QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 高斯濾波Mat gaussianImage;GaussianBlur(image, gaussianImage, Size(5, 5), 0, 0); // 5x5的高斯濾波器// 顯示原始圖像和濾波后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc").toStdString(), gaussianImage);waitKey(0);return;
}

在這里插入圖片描述

3.1.3 中值濾波:medianBlur 函數

中值濾波是一種非線性濾波方法,它用鄰域內像素的中值代替中心像素的值,能夠有效去除椒鹽噪聲。

//中值濾波
void MainWindow::on_bt6_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 中值濾波Mat medianImage;medianBlur(image, medianImage, 5); // 5x5的中值濾波器// 顯示原始圖像和濾波后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc").toStdString(), medianImage);waitKey(0);return;
}
}

在這里插入圖片描述

3.2 邊緣檢測

邊緣檢測是計算機視覺中的重要任務,用于識別圖像中亮度變化明顯的區域。

3.2.1 Canny 邊緣檢測:Canny 函數

Canny 邊緣檢測是一種多階段的邊緣檢測算法,包括高斯平滑、梯度計算、非極大值抑制和雙閾值處理。

//Canny邊緣檢測
void MainWindow::on_bt7_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// Canny邊緣檢測Mat edges;Canny(image, edges, 50, 150); // 低閾值50,高閾值150// 顯示原始圖像和處理后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc").toStdString(), edges);waitKey(0);return;
}

測試結果:
在這里插入圖片描述

3.2.2 Sobel 邊緣檢測:Sobel 函數

Sobel 算子是一種常用的邊緣檢測算子,用于計算圖像灰度函數的近似梯度。

// Sobel邊緣檢測
void MainWindow::on_bt8_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// Sobel邊緣檢測Mat sobelx, sobely, sobel;// 計算x和y方向的梯度Sobel(image, sobelx, CV_64F, 1, 0, 3);Sobel(image, sobely, CV_64F, 0, 1, 3);// 合并梯度convertScaleAbs(sobelx, sobelx);convertScaleAbs(sobely, sobely);addWeighted(sobelx, 0.5, sobely, 0.5, 0, sobel);// 顯示原始圖像和處理后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc").toStdString(), sobely);waitKey(0);return;
}

測試結果:
在這里插入圖片描述

3.3 形態學操作

形態學操作是基于圖像形狀的一系列圖像處理操作,主要包括腐蝕、膨脹、開運算和閉運算。

3.3.1 腐蝕:erode 函數

腐蝕操作會減小圖像中的前景區域,常用于去除小的噪聲點。

//腐蝕
void MainWindow::on_bt9_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 創建結構元素Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));// 腐蝕操作Mat eroded;erode(image, eroded, element);// 顯示原始圖像和處理后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc").toStdString(), eroded);waitKey(0);return;
}

測試結果:
在這里插入圖片描述

3.3.2 膨脹:dilate 函數

膨脹操作會增大圖像中的前景區域,常用于連接斷裂的物體。

//膨脹
void MainWindow::on_bt10_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 創建結構元素Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));// 膨脹操作Mat dilated;dilate(image, dilated, element);// 顯示原始圖像和處理后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc").toStdString(), dilated);waitKey(0);return;
}

測試結果:
在這里插入圖片描述

3.3.3 開運算和閉運算:morphologyEx 函數

開運算和閉運算都是復合操作,開運算先腐蝕后膨脹,閉運算先膨脹后腐蝕。

//開閉運算
void MainWindow::on_bt12_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 創建結構元素Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));// 開運算Mat opened;morphologyEx(image, opened, MORPH_OPEN, element);// 閉運算Mat closed;morphologyEx(image, closed, MORPH_CLOSE, element);// 顯示原始圖像和處理后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc_Open").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc_Close").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc_Open").toStdString(), opened);imshow(QString("Dsc_Close").toStdString(), closed);waitKey(0);return;
}

測試結果如下:
在這里插入圖片描述

四、顏色空間轉換與操作

4.1 顏色空間轉換:cvtColor 函數

cvtColor函數用于在不同顏色空間之間進行轉換,如 BGR 到灰度、BGR 到 HSV 等。

//顏色轉換
void MainWindow::on_bt13_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// BGR到灰度Mat gray;cvtColor(image, gray, COLOR_BGR2GRAY);// BGR到HSVMat hsv;cvtColor(image, hsv, COLOR_BGR2HSV);// 顯示原始圖像和處理后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc_Gray").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc_HSV").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc_Gray").toStdString(), gray);imshow(QString("Dsc_HSV").toStdString(), hsv);waitKey(0);return;}

測試結果顯示:
在這里插入圖片描述

4.2 顏色分割:inRange 函數

inRange函數用于在圖像中找到特定顏色范圍的區域,常用于顏色分割。

//顏色分割
void MainWindow::on_bt14_clicked()
{QString fileName = QFileDialog::getOpenFileName(this,QString("文件對話框"),"E:/test/QtTest/WidgetTest/TestOpencv/bin/debug64/Out/OutImg/",QString("圖片(*.jpg *.png);"));// 讀取圖像Mat image = imread(fileName.toStdString(), IMREAD_COLOR);if (image.empty()) {qDebug()  << QString("無法讀取圖像!");return;}// 轉換到HSV顏色空間Mat hsv;cvtColor(image, hsv, COLOR_BGR2HSV);// 定義藍色的HSV范圍Scalar lower_blue = Scalar(100, 150, 0);Scalar upper_blue = Scalar(140, 255, 255);// 創建掩碼Mat mask;inRange(hsv, lower_blue, upper_blue, mask);// 應用掩碼Mat result;bitwise_and(image, image, result, mask);// 顯示原始圖像和處理后的圖像namedWindow(QString("Src").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc_Mask").toStdString(), WINDOW_AUTOSIZE);namedWindow(QString("Dsc_Result").toStdString(), WINDOW_AUTOSIZE);imshow(QString("Src").toStdString(), image);imshow(QString("Dsc_Mask").toStdString(), mask);imshow(QString("Dsc_Result").toStdString(), result);waitKey(0);return;
}

運行結果如下:
在這里插入圖片描述
OK,以上通過十幾個示例代碼展示了OpenCV圖像讀寫及一些基本變換的應用,由于篇幅有限,下一篇,再將一些實際應用比如角點檢測,特征提取,人臉檢測等功能演示出來。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91180.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91180.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91180.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Umi從零搭建Ant Design Pro項目(3)集成 openapi 插件

1. 安裝插件 pnpm add umijs/max-plugin-openapi pnpm add swagger-ui-dist如果不安裝swagger-ui-dist&#xff0c;不會影響運行。但會報錯。 2.配置文件export default defineConfig({// umi插件配置plugins: [umijs/max-plugin-openapi],// openAPI配置openAPI: {requestLibP…

Flutter開發實戰之狀態管理深入解析

第4章:狀態管理深入解析 前言 想象一下,你正在開發一個購物車應用。用戶在商品頁面添加商品,然后去購物車頁面查看,最后到結算頁面付款。在這個過程中,購物車的數據需要在多個頁面之間保持同步和一致。這就是狀態管理要解決的核心問題。 狀態管理是Flutter開發中最重要…

組件化(一):重新思考“組件”:狀態、視圖和邏輯的“最佳”分離實踐

組件化(一)&#xff1a;重新思考“組件”&#xff1a;狀態、視圖和邏輯的“最佳”分離實踐 引子&#xff1a;組件的“內憂”與“外患” 至此&#xff0c;我們的前端內功修煉之旅已經碩果累累。我們掌握了組件化的架構思想&#xff0c;擁有了高效的渲染引擎&#xff0c;還探索…

【Redis】Redis 協議與連接

一、Redis 協議 1.1 RESP RESP 是 Redis 客戶端與服務器之間的通信協議&#xff0c;采用文本格式&#xff08;基于 ASCII 字符&#xff09;&#xff0c;支持多種數據類型的序列化和反序列化 RESP 通過首字符區分數據類型&#xff0c;主要支持 5 種類型&#xff1a; 類型首字…

Android通知(Notification)全面解析:從基礎到高級應用

一、Android通知概述通知(Notification)是Android系統中用于在應用之外向用戶傳遞信息的重要機制。當應用需要告知用戶某些事件或信息時&#xff0c;可以通過通知在狀態欄顯示圖標&#xff0c;用戶下拉通知欄即可查看詳細信息。這種機制幾乎被所有現代應用采用&#xff0c;用于…

VUE3(四)、組件通信

1、props作用&#xff1a;子組件之間的通信。父傳子&#xff1a;屬性值的非函數。子傳父&#xff1a;屬性值是函數。父組件&#xff1a;<template><div>{{ childeData }}</div>——————————————————————————————<child :pare…

【數據結構與算法】數據結構初階:詳解二叉樹(六)——二叉樹應用:二叉樹選擇題

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 &#x1f349;學習方向&#xff1a;C/C方向 ??人生格言&#xff1a;為天地立心&#xff0c;為生民立命&#xff0c;為…

Android廣播實驗

【實驗目的】了解使用Intent進行組件通信的原理&#xff1b;了解Intent過濾器的原理和匹配機制&#xff1b;掌握發送和接收廣播的方法【實驗內容】任務1、普通廣播&#xff1b;任務2、系統廣播&#xff1b;任務3、有序廣播&#xff1b;【實驗要求】1、練習使用靜態方法和動態方…

html轉word下載

一、插件使用//轉html為wordnpm i html-docx-js //保存文件到本地npm i file-saver 注&#xff1a;vite 項目使用esm模式會報錯&#xff0c;with方法錯誤&#xff0c;修改如下&#xff1a;//直接安裝修復版本npm i html-docx-fixed二、封裝導出 exportWord.jsimport htmlDocx f…

北方公司面試記錄

避免被開盒&#xff0c;先稱之為“北方公司”&#xff0c;有確定結果后再更名。 先說流程&#xff0c;線下面試&#xff0c;時間非常急&#xff0c;下午兩點鐘面試&#xff0c;中午十二點打電話讓我去&#xff0c;帶兩份紙質簡歷。 和一般的菌工單位一樣&#xff0c;先在傳達室…

linux——ps命令

PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND0 1 1 1 ? -1 Ss 0 0:01 /usr/lib/systemd/systemd1 123 123 123 ? -1 S 0 0:00 /usr/sbin/sshd -D123 456 456 456 pts/0 456 R 10…

C#.NET 依賴注入詳解

一、是什么 在 C#.NET 中&#xff0c;依賴注入&#xff08;Dependency Injection&#xff0c;簡稱 DI&#xff09; 是一種設計模式&#xff0c;用于實現控制反轉&#xff08;Inversion of Control&#xff0c;IoC&#xff09;&#xff0c;以降低代碼耦合、提高可測試性和可維護…

Vue監視數據的原理和set()的使用

在 Vue 中&#xff0c;Vue.set()&#xff08;或 this.$set()&#xff09;是用于解決響應式數據更新檢測的重要方法&#xff0c;其底層與 Vue 的數據監視原理緊密相關。以下從使用場景和實現原理兩方面詳細說明&#xff1a;一、Vue.set () 的使用場景與用法1. 為什么需要 Vue.se…

在 Vue 中,如何在回調函數中正確使用 this?

在 Vue 組件中&#xff0c;this 指向當前組件實例&#xff0c;但在回調函數&#xff08;如定時器、異步請求、事件監聽等&#xff09;中&#xff0c;this 的指向可能會丟失或改變&#xff0c;導致無法正確訪問組件的屬性和方法。以下是在回調函數中正確使用 this 的幾種常見方式…

第4章唯一ID生成器——4.4 基于數據庫的自增主鍵的趨勢遞增的唯一ID

基于數據庫的自增主鍵也可以生成趨勢遞增的唯一 ID&#xff0c;且由于唯一ID不與時間戳關聯&#xff0c;所以不會受到時鐘回撥問題的影響。 4.4.1 分庫分表架構 數據庫一般都支持設置自增主鍵的初始值和自增步長&#xff0c;以MySQL為例&#xff0c;自增主鍵的自增步長由auto_i…

設計模式:Memento 模式詳解

Memento 模式詳解Memento&#xff08;備忘錄&#xff09;模式是一種行為型設計模式&#xff0c;用于在不破壞封裝性的前提下&#xff0c;捕獲并外部化一個對象的內部狀態&#xff0c;以便在之后能夠將該對象恢復到原先保存的狀態。它廣泛應用于需要實現撤銷&#xff08;Undo&am…

數據結構(6)單鏈表算法題(下)

一、環形鏈表Ⅰ 1、題目描述 https://leetcode.cn/problems/linked-list-cycle 2、算法分析 思路&#xff1a;快慢指針 根據上圖所示的流程&#xff0c;我們可以推測出這樣一個結論&#xff1a;若鏈表帶環&#xff0c;快慢指針一定會相遇。 那么&#xff0c;這個猜測是否正…

智能制造,從工廠建模,工藝建模,柔性制造,精益制造,生產管控,庫存,質量等多方面講述智能制造的落地方案。

智能制造&#xff0c;從工廠建模&#xff0c;工藝建模&#xff0c;柔性制造&#xff0c;精益制造&#xff0c;生產管控&#xff0c;庫存&#xff0c;質量等多方面講述智能制造的落地方案。

Qt 分裂布局:QSplitter 使用指南

在 GUI 開發中&#xff0c;高效管理窗口空間是提升用戶體驗的關鍵。QSplitter 作為 Qt 的核心布局組件&#xff0c;讓動態分割窗口變得簡單直觀。一、QSplitter 核心功能解析 QSplitter 是 Qt 提供的布局管理器&#xff0c;專用于創建可調節的分割區域&#xff1a; 支持水平/垂…

R語言與作物模型(DSSAT模型)技術應用

R語言在DSSAT模型的氣候、土壤、管理措施等數據準備&#xff0c;自動化模擬和結果分析上都發揮著重要的作用。一&#xff1a;DSSAT模型的高級應用 1.作物模型的概念 2.DSSAT模型發展現狀 3.DSSAT與R語言的安裝 4.DSSAT模型的高級應用案例 5.R語言在作物模型參數優化中的應用 6.…