
この記事では、DM816x / C6A816x / AM389xデバッグボードとC6Accelフレームワーク(別名C6EZAccel)について理解するとともに、組み込みのテストアプリケーションを実行するためのシステムのセットアップ方法について説明します。
すべては、マイクロプロセッサでコンピュータービジョンの現在非常に人気のあるOpenCVライブラリのアルゴリズムを使用するという興味深いアイデアから始まりました。 しかし、少しトピックを勉強したので、アイデアは明確になりました。 ARMコアだけでなく、DSP信号のデジタル処理専用のコアにアルゴリズムを実装しないのはなぜですか? したがって、ARMコアをアンロードし、アルゴリズムの実行を高速化することで、最も面倒なアプリケーションがリアルタイムで動作するようになります。
では、問題を解決するために何を使うべきでしょうか? それは少しオプションが判明しました...
すべてを論理的かつ連続的に検討してください。 そもそも、DSPプロセッサを使用できます-これがC6Accelフレームワークです。 まあ、それは最新バージョン-2.01.00.11でのみOpenCV(および2.x)をサポートします。 同様に、このフレームワークはマイクロプロセッサーC6A81xx / DM81xx用に作成されています。 記事のタイトルで、あなたはすでにTI EZSDKソフトウェアインターフェイスを必要とするDM8168に出くわしたことを推測しました(最新バージョンは05/05 / 02.00です)。
詳細を知りたい人のために、記事の最後に役立つリンクがあります。
1.デバッグボードDM816x / C6A816x / AM389xの説明

Texas InstrumentsとSpectrum Digitalが共同で開発したコンピューティングモジュールDM816x / C6A816x / AM389xは、DM816x DaVinci MPU(DM8168、DM8167、DM8166、DM8165)、C6A816x C6-Integra DSP + ARMプロセッサ(C6A8168、C6A8168、C6A8168、C6A8168、C6A8168、C6A8168)での開発を可能にしますAM389x Sitara ARM MPU(AM3894、AM3892)。
この技術の奇跡は、監視用のビデオレコーダー(DVR)、ビデオ会議システム、テレビ放送システム、メディアサーバー、シングルボードコンピューター、コンピューティングゲートウェイマシン、ルーター、サーバー、産業オートメーション、ユーザーマシンインターフェイス(HMI)などの幅広いソリューション向けに設計されています)、データ収集、マシンビジョン、テスト、測定、追跡、監視などのアプリケーション用のサービスポイント端末

次に、オブジェクト自体を見てみましょう。 プリント基板の2つのブロックで構成されています。
- コンピューティングモジュール8168(上);
- 拡張I / Oドーターカード(下)。
多数のコンポーネントがあるため、最も重要なコンポーネントのみに注意を向けます。

上の図は、以下のコンポーネントがマークされたコンピューティングモジュール8168を示しています。
1.および
2.は、それぞれスイッチNo. 3(SW3)およびNo. 4(SW4)です。

デフォルトでは、ボードはNANDフラッシュメモリからロードされます(ただし、SDカードからのロードなど、他の多くのモードがあります)。そのため、スイッチNo. 3およびNo. 4は、SW3 [9:0] =” 0000010010”およびSW4 [1:0] =” 10” [NAND / SPI]。
3.シリアルポート(COMポート)。
4. HDMIポート。
5.イーサネットポート。
6. USBポート。
7.コンポーネントビデオコネクタ。
8. SDカードスロット。
9.電源ソケット。
10.電源スイッチ。
11.マイクロプロセッサーDM8168(AM3894およびC6A816をエミュレート)。
機能図:

特別な機能:
•C674x DSP VLIWプロセッサ(最大1 GHz、コマンドタイプ-固定小数点および浮動小数点)。
•ARM Cortex-A8 RISCプロセッサ(最大1.2 GHz)。
•3DグラフィックスアクセラレータSGX530。
•高解像度ビデオ処理サブシステム(HDVPSS)。
•複数のビデオストリームのキャプチャ、エンコード、デコード、および分析を行い、H.264、MPEG4、H263、VC1 / RTV、AVS、RV10、ON2、JPEG、MPEG2をサポートする3つのプログラム可能な高解像度ビデオ処理コプロセッサー(HDVICP2) Divx。
•幅広い周辺モジュール:
-2チャネルギガビットイーサネット。
-2つのPCI Expressレーン。
-物理層が統合された2つのSATAチャネル。
-物理層が統合された2つのUSB 2.0チャネル。
-DDR3、MMC / SD、HDMIおよびDVIインターフェイス。
さらに作業を進めるために、コンポーネント3、5、9に接続し、スイッチ1、2、10を設定しました。
2. C6Accelフレームワークの説明
C6Accelは、Texas Instruments(TI)の完全に無料のソフトウェア開発ツールです。 TIのデュアルコアヘテロジニアスSoCプロセッサでのDSPコードの開発を簡素化することを目的としています。つまり、ARM上でLinuxを実行し、C6000ファミリのDSPプロセッサを含むARM + DSPデバイス向けです。
2.1。 C6Accelの構成要素は何ですか?
C6EZAccelは、
XDAIS (eXpressDsp Algorithm Interoperability Standard)と呼ばれるアルゴリズムインターフェイスに準拠したデジタル信号処理アルゴリズムで構成されています。 TIは、XDAISインターフェイスを使用して記述されたアルゴリズムの効率的な実行を可能にする
Codec Engineと呼ばれるフレームワークも提供します。 TIは、SoCソフトウェアの一部としてすべてのコーデックを提供しており、コーデックエンジンの使用を推奨しています。 C6EZAccelは、API(アプリケーションプログラミングインターフェイス)を提供するコーデックエンジンのアドオンであるARMサイドライブラリも備えています。 また、ARM側のアプリケーションコードは、DSPでXDAISアルゴリズムの実行を呼び出すことができます。 このライブラリには、キャッシュ管理、アドレス変換、パラメータの受け渡し、ARMで実行されているアプリケーションからのエラー処理が含まれています。
2.2。 C6Accelはどのように機能しますか?
ARMアプリケーションコード(またはそれを使用するミドルウェア)は、C6Accelを呼び出します。 ライブラリシェルAPIおよび/またはコーデックエンジンを使用します。これは、VISA APIと同様に、オーディオ/ビデオ/音声コーデックを呼び出すために使用されるiUniversal APIと互換性があります。 次に、これらのAPIはコーデックエンジンインターフェイスを調べ、DSPでC6Accelアルゴリズムを呼び出します。これにより、関数呼び出しが識別され、アプリケーションから渡されたパラメーターを使用してDSPで対応する機能が呼び出されます。

3. EZSDKおよびC6Accelの使用
十分な理論、練習に取りかかりましょう。 EZSDK 05/05 / 02.00は、
Ubuntu 10.04 LTS 32-bitまたは
Ubuntu 11.10 32-bitでのみサポートされてい
ます 。 したがって、これらのOSのいずれもインストールされていない(もちろん、新しいバージョンで作業している)人は、VirtualBoxなどの仮想マシンを使用する必要があります。 インストールと構成の手順については、
こちらをご覧
ください 。
以下の表記が使用されます。
- host $-ホストで実行するコマンド。
- ターゲット#-ターゲットOSで実行するコマンド。
3.1。 EZSDKのインストールとビルド
EZSDKの使用を開始する前に、C
CodeSourcery Toolchain 2009q-203コンパイラをダウンロードしてインストールする必要があります。 アーカイブをホームディレクトリに解凍するだけです。
EZSDK 05/05 / 02.00をダウンロードして実行:
host $ sudo ./ezsdk_dm816x-evm_5_05_02_00_setuplinux
インストーラーが起動します。 CodeSourcery Toolchainの場所、つまり/ home /%username%/ arm-2009q1 / binを指定し、EZSDKをインストールするパスは/ home /%username%/ ezsdkです。
このソフトウェアの開発者は私たちの世話をし、インタラクティブスクリプトを作成しました(OCバージョンに厳密にバインドする理由の1つ)。
host $ export EZSDK="${HOME}/ezsdk" host $ sudo ${EZSDK}/setup.sh
スクリプトは必要なパッケージをインストールし、説明を求めます:
- ターゲットファイルシステムをインストールするパスは、/ home /%username%/ targetfsです。
- tftpルートディレクトリパス-/ tftpboot;
- シリアルポートパスは/ dev / ttyUSB0(USBポート経由で接続するため)または/ dev / ttyS0(COMポート経由で接続するため)です。
- ホストマシンのIPアドレス-それぞれに独自のアドレスがあります(たとえば、10.54.4.44があります)。
- Linuxカーネルの場所は、提案されたリストの最初、つまりTFTPです。
- ルートファイルシステムの場所は、提案されたリストの最初、つまりNFSです。
- TFTPからロードされたカーネルイメージの名前はuImage-dm816x-evm.binです。
- minicom用のスクリプトを作成するかどうか-同意します。
- 作成したスクリプトをすぐに実行するかどうか-拒否します。
このスクリプトを修正しましょう。テキストエディタで開き、「mem = 364M @ 0x80000000 mem = 320M @ 0x9FC00000」というテキストを「mem = 364M」に置き換えます。将来、必要なカーネルモジュールをロードできないためです。
次に、ボード上で操作を実行するには、スクリプトで指定された設定でコマンドを使用してminicomを実行する必要があります
host $ minicom -S setup_uimage-tftp_fs-nfs.minicom
次に、ボードを再起動する必要があります。
EZSDKを構築する際、一部のコンポーネントが不足しているために問題が発生します。 ディレクトリ/ home /%username%/ ezsdk / example-applicationsでアーカイブ
8272.pcie.tar.gzを解凍することで修正できます。
最後に、EZSDKコマンドを収集します
host $ cd ${HOME}/ezsdk host $ sudo make all host $ sudo make install
3.2。 C6Accelのインストールとアセンブリ
C6Accel 2.01.00.11をダウンロードして実行します:
host $ sudo ./c6accel_2_01_00_11_Linux-x86_Setup.bin
インストールパス/ home /%username%/ c6accelを指定します。
SYS / BIOSリアルタイムオペレーティングシステムはEZSDKの不可欠な部分ですが、6.3.02.09以降のバージョンは、C6Accelの構築時に必要なリアルタイムデータeXchange(RTDX)をサポートしていません。 したがって、C6Accel専用の
SYS / BIOS 6.32.02.09をインストールし
ます 。
host $ sudo ./bios_setuplinux_6_32_02_39.bin
インストールパス/ home /%username%/ c6accel / bios_6_32_02_39を指定します。
/ home /%username%/ c6accelのRules.makeファイルのパスを次のように修正します。
DVSDK_INSTALL_DIR=$(HOME)/ezsdk TARGETFS_INSTALL_DIR = $(HOME)/targetfs C6ACCEL_INSTALL_DIR=$(HOME)/c6accel BIOS_INSTALL_DIR = $(HOME)/c6accel/bios_6_32_02_39 DSPDEVKIT_INSTALL_DIR= $(DVSDK_INSTALL_DIR)/dsp-devkit LINUXDEVKIT_INSTALL_DIR = $(DVSDK_INSTALL_DIR)/linux-devkit PLATFORM = dm816x-evm
最後に、C6Accelコマンドをまとめます。
host $ cd ${HOME}/c6accel host $ sudo make all host $ sudo make install
3.3。 DSPテストの実行
C6AccelにDSPプロセッサでのコード実行のテスト用のサンプルが含まれているのは素晴らしいことです。 cmemおよびdsplinkモジュール(これらはCodecEngineがロードされるARMおよびDSPバインディングライブラリ)をロードするためのスクリプトを実行し、テストアプリケーションを実行しましょう。
target
やった! コンソールのレポートによると、すべてが正常であり、何も壊れていません******************************************************** ******************************
C6でカーネルをテストするためのサンプルアプリケーション
******************************************************** ******************************
CERuntime完了
作成されたC6Accelハンドル
-
C6Accelのビジョン/分析機能のテスト:
-
関数のテスト:VLIB_histogram_1D_dU8 ...
VLIB_histogram_1D_U8はテストに合格しました!
関数のテスト:VLIB_histogram_1D_U16 ...
VLIB_histogram_1D_U16はテストに合格しました!
関数のテスト:VLIB_histogram_nD_U16 ...
VLIB_histogram_nD_U16はテストに合格しました!
関数のテスト:VLIB_weightedHistogram_1D_U8 ...
VLIB_weightedHistogram_1D_U8はテストに合格しました!
関数のテスト:VLIB_weightedHistogram_nD_U16 ...
VLIB_weightedHistogram_nD_U16はテストに失敗しました!
VLIB_unpackMask32はテストに合格しました!
VLIB_packMask32はテストに合格しました!
VLIB_subtractBackGroundS16はテストに合格しました!
VLIB_subtractBackGroundS32はテストに合格しました!
関数のテスト:VLIB_extractLumaFromUYUV ...
VLIB_extractLumaFromUYUVのC6accelテストがテストに合格しました!
関数のテスト:VLIB_convertUYVYsemipl_to_YUVpl ...
VLIB_convertUYVYsemipl_to_YUVplはテストに合格しました!
関数のテスト:VLIB_convertUYVYpl_to_YUVint ...
VLIB_convertUYVYpl_to_YUVintはテストに合格しました!
関数のテスト:VLIB_convertUYVYint_to_YUVpl ...
VLIB_convertUYVYint_to_YUVplはテストに合格しました!
関数のテスト:VLIB_convertUYVYint_to_RGBpl ...
VLIB_convertUYVYint_to_RGBplはテストに合格しました!
関数のテスト:VLIB_ConvertUYVYint_to_YUV420pl ...
VLIB_ConvertUYVYint_to_YUV420plはテストに合格しました!
関数のテスト:VLIB_convertUYVYint_to_LABpl ...
VLIB_convertUYVYint_to_LABplはテストに合格しました!
関数のテスト:VLIB_convertUYVYint_to_HSLpl ...
VLIB_convertUYVYint_to_HSLplはテストに合格しました!
関数のテスト:VLIB_convertUYVYint_to_LABpl_LUT ...
初期化が完了しました。
VLIB_convertUYVYint_to_LABpl2はテストに合格しました!
VLIB_harrisScore_7x7のテスト...
VLIB_harrisScore_7x7はテストに合格しました!
ルジャンドル多項式の初期化
ルジャンドルモーメントの計算
関数のテスト:VLIB_legendreMoments ...
VLIB_legendreMomentsはテストに合格しました!
関数のテスト:VLIB_normalFlow_16 ...
VLIB_normalFlow_16はテストに合格しました!
関数のテスト:VLIB_kalmanFilter_4x6関数...
VLIB_kalmanFilter_ VLIB_recursiveFilterHoriz1stOrderS16 ...
VLIB_recursiveFilterHoriz1stOrderS16はテストに合格しました!
VLIB_recursiveFilterVert1stOrkernel.derのテスト...
VLIB_recursiveFilterVert1stOrderはテストに合格しました!
VLIB_recursiveFilterVert1stOrderS16のテスト...
VLIB_recursiveFilterVert1stOrderS16はテストに合格しました!
関数のテスト:VLIB_bhattacharyaDistance_U32 ...
VLIB_bhattacharyaDistance_U32はテストに合格しました!
関数のテスト:VLIB_L1DistanceS16 ...
VLIB_L1DistanceS16関数はテストに合格しました
VLIB_dilate_bin_maskはテストに合格しました!
VLIB_dilate_bin_squareはテストに合格しました!
VLIB_dilate_bin_crossがテストに合格しました!
VLIB_erode_bin_maskはテストに合格しました!
VLIB_erode_bin_squareはテストに合格しました!
VLIB_erode_bin_crossがテストに合格しました!
VLIB_trackFeaturesLucasKanade_7x7のテスト...
VLIB_trackFeaturesLucasKanade_7x7はテストに合格しました!
VLIBキャニー関数テスト結果:
IMG_conv_7x7:テストに合格しました!
VLIB_xyGradient:テストに合格しました!
VLIB_nonMaximumSuppressionCanny:テストに合格しました!
VLIB_doublethresholding:テストに合格しました!
VLIB_edgeRelaxation:テストに合格しました!
Chained Canny APIの呼び出し:
連鎖キャニーエッジ検出機能がテストに失敗しました!
関数のテスト:VLIB_integralImage8 ...
VLIB_integralImage8はテストに合格しました!
関数のテスト:VLIB_integralImage16 ...
VLIB_integralImage16はテストに合格しました!
関数のテスト:VLIB_imagePyramid8 ...
VLIB_imagePyramid8はテストに合格しました!
関数のテスト:VLIB_imagePyramid16 ...
VLIB_imagePyramid16はテストに合格しました!
関数のテスト:VLIB_gauss5x5PyramidKernel_8 ...
VLIB_gauss5x5PyramidKernel_8はテストに合格しました!
関数のテスト:VLIB_gauss5x5PyramidKernel_16 ...
VLIB_gauss5x5PyramidKernel_16はテストに合格しました!
関数のテスト:VLIB_gradientH5x5PyramidKernel_8 ...
VLIB_gradientH5x5PyramidKernel_8はテストに合格しました!
関数のテスト:VLIB_gradientV5x5PyramidKernel_8 ...
VLIB_gradientV5x5PyramidKernel_8はテストに合格しました!
VLIB_initMeanWithLumaS16はテストに合格しました!
VLIB_updateEWRMeanS16はテストに合格しました!
VLIB_initMeanWithLumaS32はテストに合格しました!
VLIB_updateEWRMeanS32はテストに合格しました!
VLIB_initVarWithConstS32はテストに合格しました!
VLIB_updateEWRVarianceS32はテストに合格しました!
VLIB_initVarWithConstS16はテストに合格しました!
VLIB_updateEWRVarianceS16はテストに合格しました!
VLIB_updateUWRMeanS16はテストに合格しました!
VLIB_updateUWRVarianceS16はテストに合格しました!
-
C6Accelの画像処理機能をテストします。
-
ヒストグラム関数のテストが成功しました
メディアンフィルタリング機能のテストが成功しました
畳み込み関数のテストが成功しました
相関関数のテストが成功しました
Sobelフィルターのテストが成功しました
画像乗算関数のテストが成功しました
画像追加機能のテストが成功しました
画像減算関数のテストが成功しました
色空間変換機能のテストが成功しました
C6accel_IMG_ycbcr422pl_to_ycbcr422sp()成功
C6accel_IMG_ycbcr422sp_to_ycbcr422ile()成功
C6accel_IMG_ycbcr422sp_to_ycbcr420pl成功
-
C6Accelの固定小数点信号処理機能のテスト
-
FFT関数のテストが成功しました
逆FFT関数のテストが成功しました
自己相関機能のテストが成功しました
DoT製品機能のテストが成功しました
行列乗算のテストが成功しました
FIRフィルタリング機能のテストが成功しました
IIRフィルターのテストが成功しました
-
C6Accelの固定小数点数学関数のテスト
-
算術RTS関数のテストが成功しました
変換RTS機能のテストが成功しました
IQmath変換関数のテストが成功しました
数学IQmath関数のテストが成功しました
算術IQmath関数のテストが成功しました
Trignometric IQmath関数のテストが成功しました
-
C6Accelでの浮動小数点数学関数のテスト
-
算術RTS関数のテストが成功しました
変換RTS機能のテストが成功しました
浮動小数点RTS単精度関数のテストが成功しました
浮動小数点RTS倍精度関数のテストが成功しました
-
C6accelの浮動小数点信号処理関数のテスト
-
浮動小数点DSP FFT関数のテストが成功しました
浮動小数点DSPベクトル乗算のテストが成功した
浮動小数点DSPベクトル逆関数のテストが成功しました
浮動小数点DSPベクトル逆関数のテストが成功しました
浮動小数点DSPベクトル加重和関数のテストが成功しました
浮動小数点DSPベクトル内積関数のテストが正常に実行されました
浮動小数点DSPマトリックス関数のテストが成功しました
浮動小数点DSPマトリックス乗算機能のテストが成功しました
浮動小数点DSPマトリックス転置関数のテストが成功しました
浮動小数点DSP自己相関関数のテストが成功しました
浮動小数点DSPコンボリューション関数のテストが成功しました
浮動小数点DSP FIRフィルターのテストが成功しました
浮動小数点DSP逆FFT関数のテストが成功しました
浮動小数点DSP BIQUADフィルターのテストが成功しました
浮動小数点から倍精度へのテストが成功しました
複素数から実数および虚数のテストに合格しました
->非同期呼び出し
FFT関数のテストが成功しました
Sobelフィルターのテストが成功しました
算術RTS関数のテストが成功しました
******************************************************** ******************************
すべてのテストが完了しました。
******************************************************** ******************************
4. ARMとDSPでのOpenCV関数の動作を比較するテスト
OpenCV(オープンソースコンピュータービジョンライブラリ)は、コンピュータービジョン、画像処理、およびオープンソースコードを備えた汎用数値アルゴリズムのアルゴリズムのライブラリです。 ライブラリはCおよびC ++で記述されていますが、Java、Pythonなどでサポートされています。Linux、Windows、およびMac OS Xで動作します。
OpenCVは、リアルタイムで動作できる500以上の機能を備えた使いやすいコンピュータービジョンライブラリです。 それらは、生産の品質管理、セキュリティシステム、医療の画像処理、ユーザーインターフェイス、立体視、ロボット工学など、多くの分野をカバーしています。
OpenCVライブラリは移植性があるため、C / C ++コンパイラを備えたほとんどのシステムでコンパイルできます。 OpenCVは、ARM、MIPS、Xscaleおよびその他のプロセッサーで正常に使用されています。
C6Accel 2.01.00.11にはOpenCVのすべての機能がありますが、50しかありません。
4.1。 OpenCVのインストールとビルド
指示に従って、ARMプラットフォーム用の
OpenCV 2.2.0をビルドします。 それらを実行するときは、CodeSourcery Toolchainが既にインストールされていることに注意してください。
共有OpenCVライブラリをターゲットファイルシステムにコピーします。
host $ cp ${HOME}/build/lib/* ${HOME}/targetfs/usr/lib
4.2。 組み立てとテストの実行
最初に遭遇した問題は、画像の読み込み中のエラーです。 何らかの理由で、拡張子がpngの画像は好きではありません。エラーはcvCreateImage関数にローカライズされています。 OK、別の拡張子、たとえばbmpに変更しましょう。 これは次のように実行できます。
host $ cd ${HOME}/c6accel/soc/app/c6accel_opencv_testapp/opencv_images host $ for fname in *.png; do convert "$fname" "$fname.bmp"; done
そしてもちろん、ソースコードの拡張子を変更することを忘れないでください。 ディレクトリ/ home /%username%/ c6accel / soc / app / c6accel_opencv_testappにあるファイルappMain.cおよびc6accel_opencv_testfxns.cでは、「。png」行のすべての出現を「.png.bmp」に置き換えます。この目的のために、テキストエディターgeditキーボードショートカットCtrl + H
2番目の問題は、C6Accel_test_Matchshapes関数とcvFindCornerSubPix関数を実行するとエラーになることが判明しました(既知のバグ
http://code.opencv.org/issues/963が原因)。
appMain.cファイルで、関数C6Accel_test_Matchshapesの行をコメント化します。 ファイルc6accel_opencv_testfxns.cで、次の行のテキストをコメントアウトします。
//cvFindCorner SubPix issue to be resolved
そしてラインまで
printf("Called ARM FindCornerSubPix function (time: %f ms)\n", t_algo / 1000.0 / n);
最後に、テストアプリケーションを収集して実行します。
host $ cd ${HOME}/c6accel host $ sudo make opencv_app host $ sudo make opencv_app_install target
やった! 多くの苦痛の後、すべてが機能しました。
アプリケーションの結果は表にまとめられていますOpencv関数
| 平均時間 充足 ARMの場合、ms
| 平均時間 充足 DSPでは、ms
| マークについて 選ぶ DSP
| 実行結果の違い ARMおよびDSP(空間の距離) 特に指定のない限りL2
|
cvCanny
| 43.218000
| 42.804000
| +
| 0.000000
|
アフィン変換行列を取得
| 0.557000
| 0.411000
| +
| 0.000000
|
アフィン変換
| 46.325000
| 36.554000
| +
| 7926.342031
|
2D回転行列
| 0.314000
| 0.378000
| -
| 0.000000
|
アフィンを使用した回転
| 55.380000
| 40.985000
| +
| 774.451419
|
cvIntegral
| 6.537000
| 8.232000
| -
| 0.000000
|
cvMinMaxLoc
| 3.083000
| 1.660000
| +
| 結果の一致
|
cvNorm
| 1.881000
| 1.336000
| +
| 0.000000
|
追加
| 9.573000
| 12.434000
| -
| 0.000000
|
アブスディフ
| 9.036000
| 14.349000
| -
| 0.000000
|
Absdiffs
| 10.555000
| 12.670000
| -
| 0.000000
|
追加する
| 8.931000
| 15.852000
| -
| 0.000000
|
cvDilate
| 3.182000
| 1.282000
| +
| 0.000000
|
cvErode
| 3.093000
| 1.281000
| +
| 0.000000
|
cvLaplace
| 180.171000
| 11.968000
| +
| 0.000000
|
cvPyrDown
| 4.265000
| 4.917000
| -
| 0.000000
|
cvFilter2D
| 519.593000
| 21.259000
| +
| 3651.030129
|
cvFindContours
| 11.915000
| 17.753000
| -
| 結果の一致
|
EqualizeHist
| 5.809000
| 8.921000
| -
| 0.000000
|
セットゼロ
| 0.634000
| 3.871000
| -
| 132898.252336
|
長方形
| 5.847000
| 1.307000
| +
|
サークル
| 3.652000
| 3.323000
| +
|
フリップ
| 12.372000
| 12.071000
| +
| 0.000000
|
コピー
| 2.479000
| 6.072000
| -
|
ソーベル
| 5,463,000
| 7.197000
| -
| 0.000000
|
変換スケール
| 5.139000
| 6.044000
| -
|
適応しきい値
| 89.986000
| 33.231000
| +
| 0.000000
|
cvMulSpectrums
| 91.865000
| 15.221000
| +
| 0.086427
|
cvDFT
| 597.131000
| 99.666000
| +
|
cvNormalize
| 57.318000
| 13.576000
| +
|
cvSmooth
| 109.345000
| 57.467000
| +
| 1771.619316
|
Houghlines2d
| 2314.028000
| 634.262000
| +
| 46306.904723
|
cvCornerHarris
| 653.550000
| 168.213000
| +
| 0.136828
|
cvCornerEigenValsAndVecs
| 3430.892000
| 870.525000
| +
| 350.751214
|
cvCornerMinEigenVal
| 1384.182000
| 1.155000
| +
| -
|
cvMulSpectrums
| 91.711000
| 15.323000
| +
| 0.086427
|
cvDFT
| 597.707000
| 99.412000
| +
|
cvNormalize
| 58.782000
| 13.751000
| +
|
GoodFeaturesToTrack
| 1259.277000
| 279.508000
| +
| -
|
FindCornerSubPix
| -
| 449.029000
|
|
cvMatchTemplate
| 1576.569000
| 221.753000
| +
| 3.741657
|
cvThreshold
| 2.182000
| 4,442,000
| -
| 0.000000
|
cvBoundingRect
| 0.036000
| 0.302000
| -
| 得られた面積の差は0.000000です
|
cvDrawContour
| 0.030000
| 0.989000
| -
|
cvContourArea
| 0.049000
| 0.231000
| -
|
プロット
| -
| 183.243000
|
|
Cvtcolor
| 16.283000
| 13.804000
| +
| 0.000000
|
サイズ変更
| 18.357000
| 17.617000
| +
|
cvCalcOpticalFlowPyrLK
| 2472.993000
| 146.874000
| +
| 両方の結果は、445個の機能で構成されています。
|
HaarDetectObjects
| 2522.499000
| 460.350000
| +
| 両方の結果は5つの要素で構成されています。
ARM:
0:46、48(42x42)
1:174、48(37x37)
2:240、51(38x38)
3:110、48(40x40)
4:92、37(131x131)
DSP:
0:47、49(40x40)
1:175、49(35x35)
2:240、52(37x37)
3:17、198(34x34)
4:110、48(38x38)
|
結果によると、次のように結論付けることができます。
- 一部の関数には、実行結果に違いがあります。 シグナルプロセッサのアーキテクチャは、汎用マイクロプロセッサと比較して、一般的なDSPタスクの実行速度を最大化するという要望に関連するいくつかの機能を備えています。 DSPはまず第一に、配列の乗算された要素のアドレスの「オンザフライ」計算による乗算の複数の実行に焦点を合わせています。 さまざまな基本操作で実装されたアルゴリズムは、異なる結果を生成する可能性があります。
- DSPのすべての機能がARMよりも速く動作するわけではありません。 パターンに気付くことができます。これらは、行列の基本操作の関数または主にそれらで構成される関数です。 このような「悪い」機能はARMで実行できますが、他の機能はDSPに転送できます。 ARMプロセッサに過負荷がかかった場合、DSPの一部の「不良」機能の使用は許容されます。
- DSPで「適切な」機能を使用すると、改善が1桁以上も得られることがあります。 これらは通常、最も時間のかかる機能です。
したがって、速度、プロセッサ負荷、実行結果のバランスを取ることで、アプリケーションを大幅に最適化できます。
便利なリンク:
- ボードDM816x / C6A816x / AM389x
- ダウンロードDM816x
- EZSDKユーザーガイド
- C6Accelフレームワーク
- OpenCV + ロシア語への部分翻訳 に関する優れた本
- ARMおよびDSPプロセッサでのOpenCVの使用に関する記事