Kithara使用 OpenCV
目錄
- Kithara使用 OpenCV
- 簡介
- 需求和支持的環境
- 構建 OpenCV 庫
- 使用 CMake 進行配置以與 Kithara 一起工作
- 使用 OpenCV 庫設置項目
- 運行 OpenCV 代碼
- 圖像采集和 OpenCV
- 自動并行化
- 限制和局限性
- 1.系統建議
- 2.實時限制
- 3.不支持的功能和缺失的功能
- 4.顯示 OpenCV 對象
- OpenCV 構建實例 (采用可視化操作的方式)
- 1. 準備工作
- 2. OpenCV構建
簡介
這些指南將幫助您學習如何使用 OpenCV 3.0、3.4 和 4.1 庫在內核模式下進行實時圖像處理。我們假設您基本上已經知道如何設置項目并打開驅動程序以開始您的工作。如果你對此不熟悉,你應該看看第一個項目 教程。
OpenCV 使用我們的實時 Windows 虛擬化。這種虛擬化在實時環境中模擬 Windows API 的最重要部分。只有在無法進行仿真或不合理的情況下,虛擬化才會離開實時環境并依賴于 Windows。此外,這種虛擬化是有限的,因此在實時使用OpenCV時存在一些限制。
需求和支持的環境
OpenCV 嚴重依賴標準的 C++ 庫。這意味著與 OpenCV 和 OpenCV 庫本身交互的代碼必須使用完全相同的 C/C++ 運行時庫 (CRT) 實例。Kithara不支持任何DLL版本的CRT用于內核模式。因此,要在 Kithara 中使用 OpenCV 庫,它們必須使用靜態鏈接運行時構建為靜態庫。不能使用 OpenCV 的 DLL 版本,因為這需要 OpenCV 使用 CRT 的 DLL 版本。此外,當將 CRT 的調試版本用于其中一個構建配置時,您還需要鏈接到靜態 OpenCV 庫的調試版本(它們的名稱后面附加了一個"d")。
Windows虛擬化僅適用于Kithara實時任務和作為DLL加載到內核模式的代碼。(Kithara還允許通過其他方式將代碼加載到內核模式并實時執行,但它們不適合運行OpenCV代碼)。對于Kithara RealTime Suite 10.11,我們已經使用以下Visual Studio平臺工具集(包括靜態CRT)成功測試了OpenCV 4.1:
-
Visual Studio 2017 (vc14.16) (Visual Studio 2017 版本 15.9.11,更新 9)
-
Visual Studio 2015 (vc14.00) (Visual Studio 2015 版本 14.0.25,更新 3)
我們還對 OpenCv 3.0 和 3.4 進行了等效測試:
-
Visual Studio 2017 (vc14.16) (Visual Studio 2017 版本 15.9.11,更新 9)
-
Visual Studio 2015 (vc14.00) (Visual Studio 2015 版本 14.0.25,更新 3)
-
Visual Studio 2013 (vc12.00) (Visual Studio 2013 版本 12.0.40,Update 5)
-
Visual Studio 2010 (vc10.00) (Visual Studio 2010 版本 10.0.30)
Kithara RealTime Suite 10.11之前的驅動程序(不包括在內)支持OpenCv 3.0,并在上述版本的Visual Studio 2013和2010中進行了測試。
這些測試是通過在實時環境中運行所有 OpenCV 3.0、3.4 和 4.1 準確性測試來執行的。OpenCV 是使用默認靜態庫構建。測試是使用源代碼中的 OpenCV 3.0、3.4 和 4.1 構建執行的,如下所述。請注意,OpenCv 4 使用了 C++11 標準功能,這些功能僅在 Visual Studio 2015 之后才得到充分實現。
構建 OpenCV 庫
OpenCV 附帶了用于不同版本的 Visual Studio(2015 和 2017)的庫構建,這些庫已經可以使用。但是,我們建議您使用將要用于自己的項目的編譯器重新構建 OpenCV 庫。這不僅減少了出現兼容性問題的機會,而且還讓您有機會從 OpenCV 構建中完全刪除一些不需要或不可用的功能。
OpenCV 依賴于工具"CMake"為不同的編譯器和 IDE 生成項目文件。請參閱 OpenCV 文檔,了解如何將 CMake 與 OpenCV 一起使用。CMake 允許您配置構建并禁用對第三方庫和 API 的特定依賴項。
使用 CMake 進行配置以與 Kithara 一起工作
最重要的配置步驟是將 BUILD_SHARED_LIBS 設置為禁用,因為它默認設置為"啟用"。此外,請確保已啟用 BUILD_WITH_STATIC_CRT。
我們還建議禁用有關 OpenCL、OpenGL、CUDA 和 Windows Media(DirectShow、VFW 等)的所有條目。這些 API 不能在內核模式下使用。如果您沒有禁用它們,OpenCV 將在運行時將缺少依賴項。但是,在這種情況下,OpenCV 應該仍然可以使用。
請使用 Windows 平臺的默認并行化框架(Microsoft 并發運行時,它包含在 CRT 中)。這意味著,WITH_OPENMP 和 WITH_TBB 都應該被禁用,這已經是默認設置。否則,這些框架的 DLL 將存在依賴性,這些 DLL 無法加載到內核模式,從而可能導致錯誤。
建議啟用 INSTALL_CREATE_DISTRIB,尤其是在處理我們的示例時。它將生成一個目標項目"INSTALL",在構建時,它將把庫和包含文件放在一個共享的根目錄下。然后,您應該創建一個指向該目錄的環境變量 OPENCV_DIR。我們的示例使用此環境變量,因此它們能夠找到要鏈接到的包含文件和庫。
這可以通過 CMakeGUI 或命令行完成,如下所示:
cmake -Bbuild
-DBUILD_SHARED_LIBS=false
-DBUILD_WITH_STATIC_CRT=true
-DWITH_OPENCL=false
-DWITH_OPENGL=false
-DWITH_DIRECTX=false
-DWITH_VFW=false
-DWITH_CUDA=false
-DWITH_MSMF=false
-DWITH_IPP=true
-DWITH_OPENCLAMDBLAS=false
-DWITH_OPENCLAMDFFT=false
-DBUILD_TESTS=false
-DBUILD_PERF_TESTS=false
-DBUILD_opencv_world=false
-G "Visual Studio 15 2017" --arch x64 .\\sources\\
OpenCv 在從主要版本 3 過渡到 4 的過程中,已將其一些以前的核心模塊移動到 contrib 存儲庫中。這些是 shape、superres 和
videostab,它們與它們的構建依賴項 ximgproc 和 optflow 一起出現。4.1 也支持所有這些功能。要獲取這些內容,請參閱 他們的文檔。
使用 OpenCV 庫設置項目
除了設置內核模式DLL項目的默認方法外,您還需要將OpenCV構建的包含目錄添加到編譯器設置的包含目錄中,并將靜態庫的路徑以及要使用的庫添加到鏈接器設置中。包含文件將在" ( O P E N C V D I R ) / i n c l u d e " 下找到。庫路徑取決于使用的實際 C R T 和目標體系結構。通用路徑為 " (OPENCV_DIR)/include"下找到。庫路徑取決于使用的實際 CRT 和目標體系結構。通用路徑為" (OPENCVD?IR)/include"下找到。庫路徑取決于使用的實際CRT和目標體系結構。通用路徑為"(OPENCV_DIR)///staticlibs",其中是目標架構(x86 或 x64)和使用的 CRT 版本(vc10、vc11、vc12、vc14 或 vc15)。例如,在 Visual Studio 2013 中使用 64 位版本會導致其他鏈接器目錄為"$(OPENCV_DIR)/x64/vc12/staticlibs"。請注意,CRT 是以增量方式進行版本控制的,而不是像 Visual Studio 產品命名所建議的那樣按年份進行版本控制(即 Visual Studio 2013 使用 vc12,Visual Studio 2017 使用 vc15)。實際需要哪些庫取決于您正在使用的 OpenCV 部分。在下文中,列出了所需的可能庫。請將 XXX 替換為您想要的不帶點的 OpenCv 版本,例如 340 或 410。另請注意,Debug 版本將附加字母"d"):
-
opencv_calib3dXXX.lib
-
opencv_coreXXX.lib
-
opencv_features2dXXX.lib
-
opencv_flannXXX.lib
-
opencv_halXXX.lib
-
opencv_highguiXXX.lib
-
opencv_imgcodecsXXX.lib
-
opencv_imgprocXXX.lib
-
opencv_mlXXX.lib
-
opencv_objdetectXXX.lib
-
opencv_photoXXX.lib
-
opencv_shapeXXX.lib
-
opencv_stitchingXXX.lib
-
opencv_superresXXX.lib
-
opencv_videoXXX.lib
-
opencv_videoioXXX.lib
或者,也可以使用 opencv_worldXXX.lib,這是一個將所有其他庫捆綁到一個庫中的庫。
OpenCV 庫大多還依賴于第三方庫,這些庫隨 OpenCV 一起構建,并且與 OpenCV 構建同時構建。包括 IPP 庫、圖像編解碼器和壓縮(調試版本將附加字母"d"):
-
IlmImfd.lib
-
ippiwd.lib
-
ittnotifyd.lib
-
libjasperd.lib
-
libjpeg-turbod.lib
-
libpngd.lib
-
libprotobufd.lib
-
libtiffd.lib
-
libwebpd.lib
-
quircd.lib
-
zlibd.lib文件
某些代碼路徑還需要更多的 Windows 庫。它主要但不僅占模塊"highgui"。請注意,此列表不完整,并考慮推薦的設置。在 OpenCV 中包含對視頻格式的支持也會創建對其他庫的依賴性。
-
user32.lib
-
gdi32.lib
-
advapi32.lib
-
comctl32.lib
如果代碼未使用某些模塊,則這些列表可能會縮短。請參考 OpenCV 文檔來確定模塊的依賴關系。如果遇到來自鏈接器的有關缺少函數的錯誤消息,請首先檢查此列表以查找缺少的依賴項。
請不要忘記仍然鏈接到Kithara圖書館!如果您查看我們的示例,OpenCV 的項目配置是通過使用屬性表來解決的。這些設置將放入屬性表中,實際項目將繼承這些屬性表,并且在 Visual Studio UI 中可能不可見。這為配置階段提供了一些模塊化。
運行 OpenCV 代碼
使用Kithara RealTime Suite實時運行OpenCV代碼需要兩個主要步驟。首先,您需要將包含代碼的DLL加載到內核模式。其次,您將需要一個實際運行代碼的任務。
打開Kithara驅動程序后,可以立即加載DLL。必須使用專用函數 KS_loadVisionKernel,而不是通常的函數 KS_loadKernel。它將加載 DLL 并在適當的環境中執行其入口點。這是正確初始化 CRT 所必需的。
KSHandle hKernel;
KS_loadVisionKernel(&hKernel, "myDll.dll", 0, 0, KSF_KERNEL_EXEC);
下一步是創建一個任務,為此,我們首先需要在加載的DLL內部創建一個函數的回調,其中包含任務的代碼。
KSHandle hCallBack;
KS_createKernelCallBack(&hCallBack, hKernel, "myFunction", 0,KSF_DIRECT_EXEC |KSF_SAVE_FPU, 0);
DLL 中的函數在此處稱為"myFunction"。必須使用標志 KSF_DIRECT_EXEC,以便在觸發回調的同一上下文中運行回調。標志 KSF_SAVE_FPU 是必需的,用于在上下文切換上保存 FPU 和 SSE 寄存器的狀態。
關于結構包裝和對齊的重要通知 |
---|
如果不使用默認結構打包,請確保包含具有相同結構打包效果的 OpenCV 標頭,就像用于構建 OpenCV 一樣(通常具有 8 個字節的默認打包)。OpenCV 頭文件不強制執行特定的結構打包。結構打包不匹配將導致二進制文件不兼容,從而在運行時導致各種錯誤。 |
一個例子是我們的樣本。它們使用與默認結構打包不同的結構打包,因此需要包含 OpenCV 標頭,并恢復默認結構打包。 |
在現在實際創建任務之前,我們還必須提高為其分配的堆棧空間。默認情況下,Windows 為每個線程保留 1 MB 的堆棧空間。Kithara 只保留 3 KB,這對于像 OpenCV 這樣的庫來說是不夠的。因此,我們將 KS_setTaskStackSize 的大小提高到 Windows 線程的典型大小。
KS_setTaskStackSize(0x100000, 0);
最后,我們創建任務。必須使用標志 KSF_CUSTOM_STACK_SIZE 創建任務,才能使用我們剛剛設置的更大的堆棧大小。
KSHandle hTask;
KS_createTask(&hTask, hCallBack, 250, KSF_CUSTOM_STACK_SIZE);
有關任務的更多信息,請參見 任務模塊。
請注意,只有實際調用 OpenCV 函數的函數才能作為任務執行。處理程序等的其他回調可以正常使用,并同時駐留在同一個 DLL 中。
圖像采集和 OpenCV
由于無法實時使用OpenCV附帶的圖像捕捉功能,因此必須使用相機模塊進行圖像采集。使用相機模塊中的函數 KS_recvCameraImage,您可以檢索指向圖像數據的指針以及有關寬度、高度、像素格式和行填充的信息。像素格式是 像素格式命名約定 (PFNC) 中定義的格式之一。有了這些信息,您可以使用 OpenCV 函數來創建 OpenCV 圖像 (cv::Mat),您可以進行處理。請注意,并非所有格式都適合轉換,例如幾種不同的包裝類型。如果沒有適合轉換的函數組合,則必須自行提供轉換函數。
cv::Mat 的構造函數非常靈活,因為它允許直接使用幾種不同的圖像格式而無需復制。此外,cv::cvtColor 和 cv::mixChannels 可用于demosaic 、從不同的顏色空間轉換和重新排序通道,或合并來自不同圖像的通道。cv::Mat 構造函數的一個重要參數是參數"step",它描述了 to 行之間的字節計數。它取決于像素格式的單個像素的位大小和圖像的行填充。該步驟的計算方式如下:
step = 寬度 * bitSize / 8 + linePadding
如果行填充為零,則可以使用自動步驟。
以下是 PFNC 像素格式和匹配的 OpenCV 類型的映射:
PFNC | OpenCV Type | bitSize | bits/Channel | 備注 |
---|---|---|---|---|
Mono8 | CV_8UC1 | 8 | 8 | |
Mono8s | CV_8SC1 | 8 | 8 | |
Mono10 | CV_16UC1 | 16 | 10 | |
Mono12 | CV_16UC1 | 16 | 12 | |
Mono14 | CV_16UC1 | 16 | 14 | |
Mono16 | CV_16UC1 | 16 | 16 | |
BayerGR8, BayerBG8, BayerRG8, BayerGB8 | CV_8UC1 | 8 | 8 | 1) |
BayerGR10, BayerBG10, BayerRG10, BayerGB10 | CV_16UC1 | 16 | 10 | 1) |
BayerGR12, BayerBG12, BayerRG12, BayerGB12 | CV_16UC1 | 16 | 12 | 1) |
BayerGR16, BayerBG16, BayerRG16, BayerGB16 | CV_16UC1 | 16 | 16 | 1) |
YUV8_UYV, YCbCr_8_CbYCr, YCbCr601_8_CbYCr, YCbCr709_8_CbYCr | CV_8UC3 | 24 | 8 | 2) 4) |
RGB8, BGR8 | CV_8UC3 | 24 | 8 | 2) |
RGB10, BGR10 | CV_16UC3 | 48 | 10 | 2) |
RGB12, RGB12 | CV_16UC3 | 48 | 12 | 2) |
RGB16, RGB16 | CV_16UC3 | 48 | 16 | 2) |
RGBa8, BGRa8 | CV_8UC4 | 32 | 8 | 2) |
RGB565p, BGR565p | CV_16UC1 | 16 | 5, 6 | 3) |
-
使用 cv::cvtColor demosaic 為 3 通道圖像。
-
使用 cv::cvtColor 轉換為不同的顏色空間和/或 cv::mixChannels 對組件進行重新排序。
-
使用 cv::cvtColor 轉換為 3 通道圖像。
-
對于 YUV 和相關類型,luma 通道始終是第二個通道,因此要轉換為更常見的格式,其中 luma 是第一個通道,您必須交換通道。
平面RGB格式(‘RGB8_Planar’、‘RGB10_Planar’、‘RGB12_Planar’、‘RGB16_Planar’)應被視為’單聲道’格式,創建三個圖像,然后可以將其組合成具有_cv::mixChannels_的多通道圖像。
自動并行化
我們的軟件支持 OpenCV 使用的 Microsoft 并發運行時。不支持其他并行化框架(如 OpenMP)。
自動并行化會在其他 CPU 上啟動其他任務,這可能會與您的實時應用程序設計沖突。如果沒有明確需要,我們建議通過調用 cv::setNumThreads(0) 來禁用自動并行化。
自動并行化任務從創建它們的任務繼承實時優先級。它們大多是在首次使用時或更新線程數時創建的。因此,顯式調用 cv::setNumThreads 以受控方式創建任務可能很有用。任務以循環方式分發到可用的 CPU,同時遵循 Windows 虛擬化中的進程關聯掩碼。Windows 函數 SetProcessAffinityMask、GetProcessAffinityMask 和 GetCurrentProcess 在實時上下文中可用,使你能夠控制允許啟動哪些 CPU 新任務。
限制和局限性
1.系統建議
由于所有分配都在非分頁池中,因此內核級別的內存資源受到限制,而非分頁池本身在 Windows 中是有限的資源。此問題對于 32 位 Windows XP 尤其適用,對于非分頁池,其最大大小為 256 MBytes。對于 64 位版本或高于 XP 的版本,這些限制設置得更高,如果您安裝了足夠的物理內存,則不會造成問題。另請注意,許多數據結構需要連續內存。這在 32 位平臺上可能很少見。
2.實時限制
某些 OpenCV 操作無法實時執行,因為它們需要與 Windows 系統交互。這些是文件處理和用戶交互(Windows、輸入)等功能。這些操作需要與用戶模式線程進行通信,但用戶模式線程的優先級很高,但當然無法滿足內核模式實時任務的實時約束。
3.不支持的功能和缺失的功能
以下功能不能在內核模式下使用:
-
除 Microsoft 并發運行時以外的并行化框架
-
GPU 加速(OpenGL、OpenCL、CUDA、IPP Async、DirectX) 1)
-
任何用于圖像捕獲和視頻解碼的第三方庫(DirectShow、VfW、FFMpeg、相機 API) 2)
-
OpenCV 模塊 HighGUI 3)
-
目前沒有計劃支持 GPU 加速。我們計劃支持將基于 CPU 的加速與 IPP 一起使用,包括 AVX 和 AVX2。
-
您可以使用我們的 相機模塊 從 GigE Vision? 和 USB 3 VisionTM 相機采集圖像。
-
對模塊"HighGUI"功能的基本子集只有基本的支持。我們不建議使用內核模式中的任何 GUI 元素(另請參閱下一段)。
4.顯示 OpenCV 對象
盡管您可以從內核級別使用簡單的 HighGUI 窗口,但不建議從內核級別打開窗口。顯示 OpenCV 對象的假定方法是使用共享內存區域將序列化的 OpenCV 項復制到其中,從而使用到用戶模式的進程間通信。
OpenCV 構建實例 (采用可視化操作的方式)
不想動手的話,也能獲取我們編譯好的資源: OpenCV - 4.1.0 靜態庫下載
1. 準備工作
- 下載源碼:OpenCV官網 OpenCV - 4.1.0 下載
- 安裝 Visual Studio 2017 (參考第一個項目中 Visual Studio 2022 C++ 開發環境安裝)
Visual Studio Community 2017 (version 15.7) (x86 and x64) - (Multiple Languages)
文件名: mu_visual_studio_community_2017_version_15.3_x86_x64_11100062.exe
SHA1: EC5E128EDC90FAC0BBADECD6DB32F8F008A4D669
文件大小: 1.02GB
發布時間 : 2017-08-14
方法: 復制ed2k鏈接,打開eMule或迅雷,新建下載,粘貼鏈接,開始下載
ed2k://|file|mu_visual_studio_community_2017_version_15.3_x86_x64_11100062.exe|1069960|5984B3CD547F9F213DE21EFE5887F08D|
- 安裝CMake CMake下載 CMake 使用教程
2. OpenCV構建
-
解壓OpenCV4.1.0的源碼后,打開源碼目錄創建 【build】 文件夾
-
-
打開【cmake-gui.exe】開始構建項目,選擇源碼路徑,選擇構建目錄(使用創建的build目錄),點擊【Configure】
-
選擇構建的版本(推薦 Visual Studio 2017) ,選擇構建平臺,點擊 【Finished】,等待配置完成
-
根據上文中的一些說明進行配置
配置選項:
選項 | 操作 |
---|---|
BUILD_SHARED_LIBS | false |
BUILD_WITH_STATIC_CRT | true |
WITH_OPENCL | false |
WITH_OPENGL | false |
WITH_DIRECTX | false |
WITH_CUDA | false |
WITH_MSMF | false |
WITH_IPP | true |
WITH_OPENCLAMDBLAS | false |
WITH_OPENCLAMDFFT | false |
BUILD_TESTS | false |
BUILD_PERF_TESTS | false |
BUILD_opencv_world | false |
- 配置完成后點擊【Generate】生成Visual Studio 2017項目,等待執行完成
- 執行成功后,點擊打開項目【Open Project】
- 選擇構建版本,全部構建后,再點擊安裝,Release切換構建版本后同樣操作。
-
全部構建完成后,再【build】->【install】 目錄中就是已經編譯后的程序,你可以把他保存到你電腦的任意位置,以方便你在程序中調用;
-
注意: 生成的庫 后綴中【d】結尾代表debug版本。
現在,你可以嘗試運行一些Kithara執行OpenCV的一些示例了smp\LibraryOpenCVsmp\LibraryOpenCVDisplaysmp\LibraryOpenCVWithCamera