本文涉及的內容可能是大家在移植算法的時候會出現的錯誤,不涉及特定公司的內容,希望老板不要介意。如今臨時遇到了這些問題。解決的方法也許不是最好的。
能給他人起到一點作用就算不錯。
移植內容
1 windows上面的路徑能夠用“\”,也能夠用“/”。
可是linux上面的路徑僅僅能夠用“\”。
所以應該全部路徑都用“\”。
2 windows下使用寄存器指令集應包括“intrin.h”。對應的linux下的頭文件是“x86intrin.h”。
3 對於實數的最大值和最小值,不能直接定應min和max。能夠定義成bst_min。這樣使用起來不會和linux底層函數沖突,在windows也能夠任意使用。
4 結構體定義對齊例如以下
在LINUX平台上對齊方式是這種
#ifdef LINUX
typedef struct _SURFWeakClassifier SURFWeakClassifier
struct _SURFWeakClassifier
{ union
{
float Projection[32];
__m128 Projection_m128[8];
#ifndef VC_2005
__m256 Projection_m256[4];
#endif
}__attribute__((aligned(32)));
SURFBoxFeature Feature;
float Bias;
}__attribute__((aligned(32)));
在WINDOWS平台上是這種
typedef struct _SURFWeakClassifier
{ __declspec(align(32)) union
{
float Projection[32];
__m128 Projection_m128[8];
#ifndef VC_2005
__m256 Projection_m256[4];
#endif
};
SURFBoxFeature Feature;
float Bias;
} SURFWeakClassifier;
5 對齊方式申請內存
linux中
(SURFWeakClassifier*)_mm_malloc(sizeof(SURFWeakClassifier)*weakNum, 32);
windows 中
stageClassifier->WeakClassifiers = (SURFWeakClassifier*)_aligned_malloc(sizeof(SURFWeakClassifier)*weakNum, 32);
6 釋放內存
linux中
_mm_free(stageClassifier->WeakClassifiers);
WINDOWS中
_aligned_free(stageClassifier->WeakClassifiers);
7 __m128 取值
WINDOWS下
res0.m128_f32[3];
LINUX下
float *q = (float*)&res0;
return q[3];
8 在linux中內聯函數的參數必須是const的。
9 linux 讀取視頻
首先安裝軟件開發工作站版本號的linux。
然后再安裝yasm庫
然后安裝方法ffmpeg.
安裝x264.
10 實現windows宿主機與linux虛擬機的文件共享
在百度經驗上搜索win7與虛擬機種linux共享文件的方法。或者查看本文件夾下保存的網頁圖片。
11 安裝opencv
能夠查看本文件夾保存的網頁圖片。
遇到asm編譯的問題能夠把宏定義部分凝視掉。f.have里面sse4.2之前所有設置成1。其它設置成0。
12 當使用CV_CALL之后會產生一個問題,跳過CvSIze size的初始化這類問題.
這類問題產生的原因是CV_CALL出發的go exit跳過了變量的定義.這在嵌入式平台上是非法的.一個比較方便的解決的方法是使用{},將變量到_END_之前括住,使變量成為局部變量.
