在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MCU部署OpenCV的“進階篇”

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2022-11-24 11:16 ? 次閱讀

本文是一個小系列的第四篇,MCU部署OpenCV的“進階篇”,已經發表了“先跑篇”、"配置篇"和“實戰篇”稍后會陸續還有“優化篇”,帶您牽手OpenCV,進入OpenCV的廣闊世界。

上一期小編帶著大家簡單過了一下OpenCV的API的基本使用方法,并最終在MCU上實際跑了下。相信大家看的一定不是很過癮,本期小編將和大家一起完全從0開始構建一個基于MCUXPresso的OpenCV測試工程,并部署到MCU上。

提到這兒,可能有朋友會提出質疑:上期不是說過了,基于HelloWorld例程,把那5個可愛的庫一股腦放進去就可以了嗎?

可能事情并不是這么簡單喲!不然,小編可就有湊字+湊篇幅的嫌疑了啊。還請聽小編娓娓道來。

我們知道OpenCV是基于C++編寫的項目,而我們所常用的Hello_World例程實際上是一個C工程。這樣一來,原生的Hello_World的C工程是無法兼容,所編譯出的OpenCV庫工程的,或者說,工程本身不能支持構建C++工程。

因此,在開始部署之前,要針對性地對工程本身進行一些小小的改造,以添加對于C++的支持。

具體步驟如下:

所謂站在巨人的肩膀看得遠,先做一些準備工作:

  1. SDK代碼包:2.11.0 for i.MX RT1170

  2. MCUXPresso IDE:11.5.0

  3. 選取參考例程:SDK_rootoardsevkmimxrt1170demo_appshello_world_demo_cm7

  4. 準備好5個靜態庫:libopencv_world, libopenjp2, libjpeg-turbo, libpng, zlib

通過Quickstart Panel導入hello world例程:

034ad6c2-6b91-11ed-8abf-dac502259ad0.png

犀利的操作:添加C++支持,找到工程目錄下的.project文件,并添加:

038687c6-6b91-11ed-8abf-dac502259ad0.png

修改好之后,使用MCUXPresso IDE重新打開工程即可開啟C++屬性。

此時的C++工程屬性還是空的,首先是針對MCU C++ Compiler的配置,包括頭文件以及預編譯符號的添加:

03d29be8-6b91-11ed-8abf-dac502259ad0.png

頭文件路徑如下:

"${workspace_loc:/${ProjName}/drivers}"
"${workspace_loc:/${ProjName}/board}"
"${workspace_loc:/${ProjName}/source}"
"${workspace_loc:/${ProjName}/utilities}"
"${workspace_loc:/${ProjName}/drivers}"
"${workspace_loc:/${ProjName}/device}"
"${workspace_loc:/${ProjName}/component/uart}"
"${workspace_loc:/${ProjName}/component/lists}"
"${workspace_loc:/${ProjName}/startup}"
"${workspace_loc:/${ProjName}/xip}"
"${workspace_loc:/${ProjName}/CMSIS}"
"${workspace_loc:/${ProjName}/utilities}"
"${workspace_loc:/${ProjName}/device}"
"your_cv_pathopencvuild"
" your_cv_path opencvinclude"
" your_cv_path opencvmodulescoreinclude"
" your_cv_path opencvmodulesimgcodecsinclude"
" your_cv_path opencvmodulesimgprocinclude"
" your_cv_path opencvmodulesworldinclude"
" your_cv_path opencvmoduleshighguiinclude"
" your_cv_path opencvmodulesfeatures2dinclude"
" your_cv_path opencvmodulesmlinclude"
" your_cv_path opencvmodulesvideoinclude"
預編譯符號:
OPENCV_DISABLE_THREAD_SUPPORT=1
__NEWLIB__
CPU_MIMXRT1176DVMAA
CPU_MIMXRT1176DVMAA_cm7
XIP_BOOT_HEADER_DCD_ENABLE=1
USE_SDRAM
DATA_SECTION_IS_CACHEABLE=1
SDK_DEBUGCONSOLE=1
XIP_EXTERNAL_FLASH=1
XIP_BOOT_HEADER_ENABLE=1
PRINTF_FLOAT_ENABLE=0
SCANF_FLOAT_ENABLE=0
PRINTF_ADVANCED_ENABLE=0
SCANF_ADVANCED_ENABLE=0
FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE=1
MCUXPRESSO_SDK
CR_INTEGER_PRINTF
__MCUXPRESSO
__USE_CMSIS
DEBUG

接下來是MCU C++ Linker的配置,包括所引用的庫名字以及庫搜索路徑:

03fa2000-6b91-11ed-8abf-dac502259ad0.png

要注意,庫的搜索路徑就是存放上面那5個庫的位置。

開啟C++編程模式,問:C文件切換成C++文件需要幾步?答:只需一步!重命名hello_world.c->hello_world.cc即可。內容可以保存不變。

導入測試數據,包括壓縮格式(jpeg,PNG)或是其他未經壓縮的原始數據。

考慮到MCU平臺一般沒有片上的文件系統,或者說沒有集成文件系統。那么我們的測試數據就要以RO data的形式直接集成到鏡像中。

為了實現這一需求,介紹給大家一個很好用匯編指令:.incbin,顧名思義,指令本身就好像在隱隱地告訴我們,我就是用來include bin文件的,快點用我。

既然是匯編指令,就要新建一個匯編文件到我們的工程中。新建匯編文件放到哪里,沒有特殊要求,但是最好放到和hello_world.cc文件同一級目錄下:

041fad0c-6b91-11ed-8abf-dac502259ad0.png

添枝加葉:

.global img_start
.global img_end

img_start:
 .incbin "data/lena.jpg"
img_end:

具體測試圖片的名字可以任意指定,只不過要注意一點。如果想要使用相對路徑的話,要保證存儲圖片的位置要和hello_world.cc的位置一致。

至此,MCUXPresso工程就準備完畢了,下一步就是編寫測試代碼。

要注意,因為我們已經切換到了C++編程模式,就要順著C++的脾氣來。

比較重要的一條是:如果不想重命名hello_world.c,說:我就看.c尾綴舒服。沒問題,但是請不要忘了,在聲明函數的時候,不要忘了用extern “C”來修飾。否則,會有千千萬萬個link error向你撲面而來。

接下來開始正式編寫測試代碼

包含頭文件,你只需要一行即可,如此和諧友善:

#include "opencv2opencv.hpp"

OpenCV使用cv::Mat來表征數據,首先我們要聲明并初始化cv::Mat實例。

考慮到沒有片上文件系統的支持,上文也提到直接使用.incbin導入圖片數據。這里,我們就可以使在匯編文件中所定義的符號對這些數據進行訪問。如果是壓縮后的圖片,需要首先進行解碼操作;如果是源數據的話,可以直接使用:
extern uint8_t img_start[];
extern uint8_t img_end[];
#define IMG_LEN (img_end - img_start)
// compressed data
std::vector data(img_start, img_start + IMG_LEN);
cv::Mat img = cv::Mat(data), IMREAD_UNCHANGED);
// raw data, need to aware the shape, and also the depth, such as rgb == CV_8UC3, equal to 
// each pixel has 3 items, and each item is 8bits
Mat img(Size(480, 360), CV_8UC3);
memcpy(img.data, img_start, IMG_LEN);

尋找物體輪廓并畫出:

vector> contours;
vector hierarchy;
findContours(dst, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// To display the contours
Mat resultImage = Mat ::zeros(dst.size(),CV_8U);
drawContours(resultImage, contours, -1, Scalar(255, 0, 255));

接下來是一個更加復雜的任務,尋找矩形:

參考代碼如下:

// returns sequence of squares detected on the image.
static void findSquares( const Mat& image, vector >& squares )
{
    squares.clear();
    Mat pyr, timg, gray0(image.size(), CV_8U), gray;
    // down-scale and upscale the image to filter out the noise
    pyrDown(image, pyr, Size(image.cols/2, image.rows/2));
    pyrUp(pyr, timg, image.size());
    vector > contours;
    for( int c = 0; c < 3; c++ )
    {
        int ch[] = {c, 0};
        mixChannels(&timg, 1, &gray0, 1, ch, 1);
        // try several threshold levels
        for( int l = 0; l < N; l++ )
        {
            if( l == 0 )
            {
                Canny(gray0, gray, 0, thresh, 5);
                dilate(gray, gray, Mat(), Point(-1,-1));
            }
            else
            {
                gray = gray0 >= (l+1)*255/N;
            }
            findContours(gray, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
            vector approx;

            // test each contour
            for( size_t i = 0; i < contours.size(); i++ )
            {
                // approximate contour with accuracy proportional to the contour perimeter
                approxPolyDP(contours[i], approx, arcLength(contours[i], true)*0.02, true);
                // square contours should have 4 vertices after approximation
                if( approx.size() == 4 &&
                    fabs(contourArea(approx)) > 1000 &&
                    isContourConvex(approx) )
                {
                    double maxCosine = 0;

                    for( int j = 2; j < 5; j++ )
                    {
                        // find the maximum cosine of the angle between joint edges
                        double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
                        maxCosine = MAX(maxCosine, cosine);
                    }
                    if( maxCosine < 0.3 )
                        squares.push_back(approx);
                }
            }
        }
    }
}

編碼圖像,這里我們選擇利用調試器將編碼后的數據從內存download到我們的PC上。關于如何在MCUXPress中進行數據保存的操作,在上一篇文章中已有介紹。

std::vector decoded_img;
cv::imencode(".jpeg", img, decoded_img);
uchar *data = decoded_img.data();

不過,這里有個小坑要提醒給大家,在傳遞編碼格式時候,請不要忘記那個人見人愛的句點“.” 。也就是說,編碼格式要寫成.jpeg而不是jpeg。小編可是在這上面吃過虧的。

至此,本期小編就給大家介紹了如何從0開始新建一個MCUXPresso工程,并編寫OpenCV測試代碼進行測試。感興趣的小伙伴們快動起手來吧!

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17324

    瀏覽量

    352663
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73860
  • OpenCV
    +關注

    關注

    31

    文章

    635

    瀏覽量

    41563

原文標題:這個秋天,OpenCV和MCU更配喲(進階篇)

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AI模型部署邊緣設備的奇妙之旅:如何在邊緣端部署OpenCV

    1 簡介 Opencv(Open Source Computer Vision Library)是一個基于開源發行的跨平臺計算機視覺庫,它實現了圖像處理和計算機視覺方面的很多通用算法,已成為計算機
    發表于 12-14 09:31

    AI模型部署邊緣設備的奇妙之旅:如何在邊緣端部署OpenCV

    1簡介Opencv(OpenSourceComputerVisionLibrary)是一個基于開源發行的跨平臺計算機視覺庫,它實現了圖像處理和計算機視覺方面的很多通用算法,已成為計算機視覺領域最有
    的頭像 發表于 12-14 09:10 ?413次閱讀
    AI模型<b class='flag-5'>部署</b>邊緣設備的奇妙之旅:如何在邊緣端<b class='flag-5'>部署</b><b class='flag-5'>OpenCV</b>

    迅為iTOP-RK3568開發板驅動開發指南-第十八 PWM

    驅動基礎-進階篇 未完待續,持續更新中... 視頻教程更新至二十期 第一期_驅動基礎(包含進階篇) 第二期_字符設備基礎 第三期_并發與競爭 第四期_高級字符設備進階 第五期_中斷 第六期_平臺總線
    發表于 10-29 10:13

    【《大語言模型應用指南》閱讀體驗】+ 俯瞰全書

    松。 入門主要偏應用,比如大語言模型的三種交互方式,分析了提示工程、工作記憶和長短期記憶,此最后講了ChatGPT的接口和擴展功能應用,適合大語言模型應用技術人員閱讀。 進階篇就非常專業了,適合專業
    發表于 07-21 13:35

    opencv-python和opencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV
    的頭像 發表于 07-16 10:38 ?1405次閱讀

    opencv的主要功能有哪些

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,提供了大量的計算機視覺算法和工具。以下是OpenCV的主要功能: 圖像處理
    的頭像 發表于 07-16 10:35 ?1766次閱讀

    文檔更新 |迅為 RK3568開發板驅動指南-第十五/十六

    模型 第10 熱插拔 第11 pinctrl子系統 第12 GPIO子系統 第13 輸入子系統 第14 單總線 第15
    發表于 07-08 11:04

    I.MX6ULL-飛凌 ElfBoard ELF1板卡 - 如何在Ubuntu中編譯OpenCV庫(X86架構)

    在之前發布的文章中探討了交叉編譯OpenCV部署至嵌入式系統的方法。然而,在調試階段,我們發現在 Ubuntu 環境下將 OpenCV 編譯為 X86 架構可能更加方便和高效。 通過在主機上編譯并
    發表于 06-07 09:32

    嵌入式學習-飛凌ElfBoard ELF 1板卡 - 如何在Ubuntu中編譯OpenCV

    在之前發布的文章中探討了交叉編譯OpenCV部署至嵌入式系統的方法。然而,在調試階段,我們發現在 Ubuntu 環境下將 OpenCV 編譯為 X86 架構可能更加方便和高效。 通過在主機上編譯并
    發表于 06-07 09:21

    ELF 1技術貼|如何在Ubuntu中編譯OpenCV

    在之前發布的文章中探討了交叉編譯OpenCV部署至嵌入式系統的方法。然而,在調試階段,我們發現在Ubuntu環境下將OpenCV編譯為X86架構可能更加方便和高效。通過在主機上編譯并使用X86架構
    的頭像 發表于 05-31 16:41 ?1212次閱讀
    ELF 1技術貼|如何在Ubuntu中編譯<b class='flag-5'>OpenCV</b>庫

    FPGA布局布線優化進階篇

    邏輯復制在布局過程的早期發生,為了扇出到其他邏輯元件的結構,這些元件不可以(由于任何理由)存在于相同的近鄰。
    發表于 03-27 12:26 ?1053次閱讀
    FPGA布局布線優化<b class='flag-5'>進階篇</b>

    基于OpenCV DNN實現YOLOv8的模型部署與推理演示

    基于OpenCV DNN實現YOLOv8推理的好處就是一套代碼就可以部署在Windows10系統、烏班圖系統、Jetson的Jetpack系統
    的頭像 發表于 03-01 15:52 ?1870次閱讀
    基于<b class='flag-5'>OpenCV</b> DNN實現YOLOv8的模型<b class='flag-5'>部署</b>與推理演示

    精通8位MCU模擬外設:高手的進階指南

    PIC 與 AVR MCU是目前最受歡迎的8位MCU類別,相信不少小伙伴都上過手。PIC MCU易于編程,并且易于與其他外設接口;AVR MCU則是執行速度超快。
    發表于 02-29 14:16 ?1273次閱讀
    精通8位<b class='flag-5'>MCU</b>模擬外設:高手的<b class='flag-5'>進階</b>指南

    RT-Thread驅動開發指南進階篇-動手驅動先楫未適配的外設LCD

    經過上一的《《RT-Thread設備驅動開發指南》基礎--以先楫bsp的hwtimer設備為例》闡述,可以大致了解到RT-thread設備驅動開發的方法步驟,開發指南中的進階篇外設主要是比基礎
    的頭像 發表于 02-25 11:04 ?2784次閱讀
    RT-Thread驅動開發指南<b class='flag-5'>進階篇</b>-動手驅動先楫未適配的外設LCD

    RK3568驅動指南|驅動基礎進階篇-進階5 自定義實現insmod命令實驗

    RK3568驅動指南|驅動基礎進階篇-進階5 自定義實現insmod命令實驗
    的頭像 發表于 02-20 14:10 ?780次閱讀
    RK3568驅動指南|驅動基礎<b class='flag-5'>進階篇</b>-<b class='flag-5'>進階</b>5 自定義實現insmod命令實驗
    主站蜘蛛池模板: 天天干夜夜操美女 | 亚洲精品亚洲人成人网 | 美女大黄三级视频在线观看 | 久草免费在线播放 | 毛片色毛片18毛片美女 | 97九色| 日本一区二区三区免费看 | 天天操人人爱 | 天天爱天天做色综合 | 欧美一级乱理片免费观看 | 国产真实偷乱视频在线观看 | 色综合久久久久久久久五月性色 | 毛片高清一区二区三区 | 中文字幕在线播放第一页 | 久久理论片 | 日本69sex护士hd | 日本中文字幕在线播放 | 美女张开大腿让男人桶 | 91网站免费在线观看 | 能直接看黄的网站 | 黄色成人一级片 | 色综合天天综合网国产国产人 | 美女久久久| 性喷潮久久久久久久久 | 午夜影院三级 | 三级视频在线播放线观看 | 456性欧美欧美在线视频 | 欧洲综合色| 久久久午夜 | 欧美成人免费 | 色香蕉在线 | aaaaa特级毛片 | 在线视免费频观看韩国aaa | 人人射人人 | 98色花堂永久地址国产精品 | 亚洲国产色婷婷精品综合在线观看 | toyota东热综合网 | 美女h片| 在线网站黄色 | 欧美无遮挡国产欧美另类 | 天天色综合2 |