本文主要演示如何使用LockAI視覺識別模塊進行視頻流的讀取,同時使用Edit模塊進行圖像傳輸。
例程源代碼地址:https://gitee.com/LockzhinerAI/LockzhinerVisionModule/tree/master/Cpp_example/A01_capture
1. 基礎知識講解
1.1 OpenCV簡介
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,提供豐富的圖像處理和視頻捕獲功能。通過其VideoCapture類,開發者可以輕松調用攝像頭設備并獲取視頻流。
1.2 VideoCapture模塊
cv::VideoCapture是OpenCV中用于管理視頻輸入的核心類,支持從攝像頭、視頻文件或網絡流讀取幀。常用功能包括:
設備初始化與參數設置(分辨率、幀率)
逐幀捕獲圖像
資源釋放管理
2. API文檔
2.1 cv::VideoCapture類
2.1.1 cv::VideoCapture類依賴頭文件
#include
2.1.2 初始化攝像頭
cv::VideoCapturecap;
功能:創建攝像頭管理對象
說明:該對象用于后續所有攝像頭操作,未調用open()前不占用硬件資源
2.1.3 設置攝像頭分辨率
cap.set(cv::CAP_PROP_FRAME_WIDTH,width);
cap.set(cv::CAP_PROP_FRAME_HEIGHT,height);
參數:
cv::CAP_PROP_FRAME_WIDTH: 幀寬度(像素)
cv::CAP_PROP_FRAME_HEIGHT: 幀高度(像素)
分辨率對照表:根據攝像頭的分辨率和幀率,選擇合適的分辨率和幀率。以下為常見分辨率與幀率對照表
攝像頭分辨率(4:3) | FPS |
---|---|
480x360 | 25 |
640x480 | 25 |
960x720 | 14 |
1280x960 | 13 |
1920x1440 | 13 |
攝像頭分辨率(16:9) | FPS |
---|---|
480x270 | 25 |
640x360 | 25 |
960x540 | 25 |
1280x720 | 15 |
1920x1080 | 12 |
2.1.4 打開攝像頭設備
cap.open(0);
參數:0表示默認攝像頭設備,也可以指定其他設備編號
返回值:成功打開返回true,否則返回false
2.1.5 讀取視頻幀
cap>>frame;
說明:讀取下一幀圖像,如果當前幀為空,則返回false
2.2 lockzhiner_vision_module::Edit類
2.2.1 依賴頭文件
#include
2.2.2 初始化模塊
Editedit;
說明:創建Edit對象,用于后續圖像傳輸操作
2.2.3 建立連接
edit.StartAndAcceptConnection();
參數:無
返回值:成功建立連接返回true,否則返回false
2.2.4 圖像傳輸
edit.Print(frame);
參數:cv::Mat對象,表示圖像幀
返回值:無
3. 綜合代碼解析
3.1 基礎攝像頭讀取
3.1.1 流程圖
3.1.2 代碼解析
初始化攝像頭
cv::VideoCapturecap;
constintwidth=640;
constintheight=480;
cap.set(cv::CAP_PROP_FRAME_WIDTH,width);
cap.set(cv::CAP_PROP_FRAME_HEIGHT,height);
逐幀捕獲圖像
while(true) {
cv::Matframe;
cap>>frame;
if(frame.empty()) {
std::cerr<<"Warning: Couldn't read a frame from the camera."
<<std::endl;
continue;
}
}
3.1.3 完整代碼實現
#include
#include
intmain() {
cv::VideoCapturecap;
cap.set(cv::CAP_PROP_FRAME_WIDTH,640);
cap.set(cv::CAP_PROP_FRAME_HEIGHT,480);
cap.open(0); // 參數0表示默認攝像頭設備
if(!cap.isOpened()) {
std::cerr<<"Error: Could not open camera."<<std::endl;
returnEXIT_FAILURE;
}
while(true) {
cv::Matframe;
cap>>frame;
if(frame.empty()) {
std::cerr<<"Warning: Couldn't read a frame from the camera."
<<std::endl;
continue;
}
}
cap.release();
return0;
}
3.2 攝像頭圖像傳輸
3.2.1 流程圖
3.2.2 代碼解析
初始化攝像頭和Edit模塊
cv::VideoCapturecap;
constintwidth=640;
constintheight=480;
cap.set(cv::CAP_PROP_FRAME_WIDTH,width);
cap.set(cv::CAP_PROP_FRAME_HEIGHT,height);
lockzhiner_vision_module::Editedit;
建立連接
if(!edit.StartAndAcceptConnection()) {
std::cerr<<"Error: Failed to start and accept connection."<<std::endl;
returnEXIT_FAILURE;
}
逐幀捕獲圖像并傳輸
while(true) {
cv::Matframe;
cap>>frame;
if(frame.empty()) {
std::cerr<<"Warning: Couldn't read a frame from the camera."
<<std::endl;
continue;
}
edit.Print(frame);
}
3.2.3 完整代碼實現
#include
#include
#include
intmain()
{
// 初始化 edit 模塊
lockzhiner_vision_module::Editedit;
if(!edit.StartAndAcceptConnection())
{
std::cerr<<"Error: Failed to start and accept connection."<<std::endl;
returnEXIT_FAILURE;
}
std::cout<<"Device connected successfully."<<std::endl;
// 初始化攝像頭
cv::VideoCapturecap;
intwidth=640; // 設置攝像頭分辨率寬度
intheight=480;// 設置攝像頭分辨率高度
cap.set(cv::CAP_PROP_FRAME_WIDTH,width);
cap.set(cv::CAP_PROP_FRAME_HEIGHT,height);
// 打開攝像頭設備
cap.open(0);// 參數 0 表示默認攝像頭設備
if(!cap.isOpened())
{
std::cerr<<"Error: Could not open camera."<<std::endl;
returnEXIT_FAILURE;
}
// 主循環:讀取攝像頭幀并傳遞給 edit 模塊
while(true)
{
cv::Matframe;// 存儲每一幀圖像
cap>>frame; // 獲取新的一幀
// 檢查是否成功讀取幀
if(frame.empty())
{
std::cerr<<"Warning: Couldn't read a frame from the camera."
<<std::endl;
continue;
}
// 使用 edit 模塊處理幀
edit.Print(frame);
}
// 釋放攝像頭資源
cap.release();
return0;
}
4. 編譯過程
4.1 編譯環境搭建
請確保你已經按照開發環境搭建指南正確配置了開發環境。
同時以正確連接開發板。
4.2 Cmake介紹
# CMake最低版本要求
cmake_minimum_required(VERSION3.10)
project(test_capture)
set(CMAKE_CXX_STANDARD17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 定義項目根目錄路徑
set(PROJECT_ROOT_PATH"${CMAKE_CURRENT_SOURCE_DIR}/../..")
message("PROJECT_ROOT_PATH = "${PROJECT_ROOT_PATH})
include("${PROJECT_ROOT_PATH}/toolchains/arm-rockchip830-linux-uclibcgnueabihf.toolchain.cmake")
# 定義 OpenCV SDK 路徑
set(OpenCV_ROOT_PATH"${PROJECT_ROOT_PATH}/third_party/opencv-mobile-4.10.0-lockzhiner-vision-module")
set(OpenCV_DIR"${OpenCV_ROOT_PATH}/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
set(OPENCV_LIBRARIES"${OpenCV_LIBS}")
# 定義 LockzhinerVisionModule SDK 路徑
set(LockzhinerVisionModule_ROOT_PATH"${PROJECT_ROOT_PATH}/third_party/lockzhiner_vision_module_sdk")
set(LockzhinerVisionModule_DIR"${LockzhinerVisionModule_ROOT_PATH}/lib/cmake/lockzhiner_vision_module")
find_package(LockzhinerVisionModule REQUIRED)
# 配置攝像頭數據
add_executable(Test-Capture test_capture.cc)
target_include_directories(Test-Capture PRIVATE${LOCKZHINER_VISION_MODULE_INCLUDE_DIRS})
target_link_libraries(Test-Capture PRIVATE${OPENCV_LIBRARIES}${LOCKZHINER_VISION_MODULE_LIBRARIES})
install(
TARGETS Test-Capture
RUNTIME DESTINATION .
)
4.3 編譯項目
使用 Docker Destop 打開 LockzhinerVisionModule 容器并執行以下命令來編譯項目
# 進入Demo所在目錄
cd/LockzhinerVisionModuleWorkSpace/LockzhinerVisionModule/Cpp_example/A01_capture
# 創建編譯目錄
rm-rfbuild &&mkdirbuild &&cdbuild
# 配置交叉編譯工具鏈
exportTOOLCHAIN_ROOT_PATH="/LockzhinerVisionModuleWorkSpace/arm-rockchip830-linux-uclibcgnueabihf"
# 使用cmake配置項目
cmake ..
# 執行編譯項目
make-j8&&makeinstall
在執行完上述命令后,會在build目錄下生成可執行文件。
5. 例程運行示例
5.1 準備工作
下載凌智視覺模塊圖片傳輸助手:點擊下載
5.2 運行過程
在凌智視覺模塊中輸入以下命令:
chmod777Test_Capture
./Test_Capture
5.3 運行效果
6. 總結
本文檔介紹了如何使用 LockAI 和 OpenCV 實現攝像頭模塊的視頻流讀取與圖像傳輸。核心步驟包括:
初始化攝像頭并設置分辨率;
打開攝像頭并逐幀捕獲圖像;
使用 Edit 模塊進行圖像傳輸。
注意事項:
推薦使用640x480分辨率以平衡性能和畫質;
確保 Edit 模塊連接成功后再進行圖像傳輸;
-
圖像采集
+關注
關注
2文章
306瀏覽量
41541 -
視覺識別
+關注
關注
3文章
94瀏覽量
16946 -
AI視覺
+關注
關注
0文章
77瀏覽量
4681
發布評論請先 登錄
評論