天天看點

basler 相機取圖逾時,basler 相機使用出現的問題

1. 周一遇到的問題:在windows下遇到的情況是:

如果我在學習的情況下,直接編譯(不正常退出),那麼第二次重新編譯,運作,運作到camera_open 的時候就會

報錯。 隻能重新插拔一下才能解決掉這個問題。basler 的相機群裡,有人給的建議是加一個斷電重連的操作。

我看了一下,需要一個類,就沒有加。後來直接在 baslercamer的.cpp 檔案下面加了:

class CHeartbeatHelper

{

public:

explicit CHeartbeatHelper(CInstantCamera& camera)

: m_pHeartbeatTimeout(NULL)

{

// m_pHeartbeatTimeout may be NULL

m_pHeartbeatTimeout = camera.GetTLNodeMap().GetNode("HeartbeatTimeout");

}

bool SetValue(int64_t NewValue)

{

// Do nothing if no heartbeat feature is available.

if (!m_pHeartbeatTimeout.IsValid())

return false;

// Apply the increment and cut off invalid values if neccessary.

int64_t correctedValue = NewValue - (NewValue % m_pHeartbeatTimeout->GetInc());

m_pHeartbeatTimeout->SetValue(correctedValue);

return true;

}

bool SetMax()

{

// Do nothing if no heartbeat feature is available.

if (!m_pHeartbeatTimeout.IsValid())

return false;

int64_t maxVal = m_pHeartbeatTimeout->GetMax();

return SetValue(maxVal);

}

protected:

GenApi::CIntegerPtr m_pHeartbeatTimeout; // Pointer to the node, will be NULL if no node exists.

};  在init 下面加了:

CHeartbeatHelper headbeatHelper(*m_camera);

headbeatHelper.SetValue(1000);

解決了 不正常退出,在連攝像頭就open 不了的情況。

2。 周二是三八節 上午想起來看一下 break,continue 跟return 的差別在哪裡。

http://blog.chinaunix.net/uid-27007072-id-3345092.html

break 是跳出循環,continue 是跳出本次循環。return 是退出函數

int Picture(float *)

{

while(1){

for(i=0;i<10;i++)

{

if()

{

if()

{

break;   // 直接退出

contine;

return;

}

}

}// break 和continue; 都是跳出到這兒。

}//end while

}// end function     // return 是出來這兒。

3. 把程式移植到 linux 下,出現的現象是 攝像頭時好時不好。

這個bug 比較隐蔽---調試了1天半。 主要是設定的numROI=2 實際上我隻初始化了一個。

導緻攝像頭有時候能正常工作,很多的時候隻能顯示一半。

調試這個bug,我接受了,技術支援的建議,就是getData 之後的圖檔列印出來,如果這部分是完整的,說明得到      的資料是對的。

4.  這個bug 好像還有,但是後來我怎麼都找不到了。 是在

void gethistArray(IplImage *src,IplImage *msk, float fea[24])

{

IplImage* r_plane = cvCreateImage(cvGetSize(src),8,1);

IplImage* g_plane = cvCreateImage(cvGetSize(src),8,1);

IplImage* b_plane = cvCreateImage(cvGetSize(src),8,1);

cvCvtPixToPlane(src,b_plane,g_plane,r_plane,0);//openCV裡面的一個函數,可以看作cvSplit是他的宏:#define cvCvtPixToPlane cvSplit

//注意順序為BGR,OpenCV中不管是Windows中Load的還是攝像頭取得的都是BGR順序排列的

//計算直方圖

//int h_bins = 100,s_bins = 32;

int hist_size = 8;

float range[] = {1,255};

float* ranges[] = {range};

CvHistogram* r_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);

CvHistogram* g_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);

CvHistogram* b_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);

int width_src=r_plane->width;

int height_src=r_plane->height;

for (int row=0;row

for(int col=0;col

{

if((msk->imageData[row*height_src+col])<250)

{

r_plane->imageData[row*height_src+col]=0;

g_plane->imageData[row*height_src+col]=0;

b_plane->imageData[row*height_src+col]=0;

}

}

cvCalcHist(&r_plane,r_hist,0,0);

cvCalcHist(&g_plane,g_hist,0,0);

cvCalcHist(&b_plane,b_hist,0,0);

for(int i = 0;i

{

float bin_val = cvQueryHistValue_1D(r_hist,i);

fea[i] = bin_val;

}

for(int i = 0;i

{

float bin_val = cvQueryHistValue_1D(g_hist,i);

fea[i + 8] = bin_val;

}

for(int i = 0;i

{

float bin_val = cvQueryHistValue_1D(b_hist,i);

fea[i + 16] = bin_val;

}

cvReleaseHist(&r_hist); // 下面新加上去的

cvReleaseHist(&g_hist);

cvReleaseHist(&b_hist);

cvReleaseImage(&r_plane);

cvReleaseImage(&g_plane);

cvReleaseImage(&b_plane);

}調試的方法是 gdb ./Main

run

然後想辦法讓程式報錯。

然後 backtrace  能看到在程式的那一個函數裡面報錯的。

然後我們在這個函數裡面加列印語句,确認是哪個函數哪裡報錯的。

顯示是cvSplit 這個函數報錯了。但是後來這個錯誤就不出來了。

4. 打包.SO 的時候出現

error adding symbols: 錯誤的值

錯誤原因是:修改makefile 編譯動态庫的時候    --fPIC gcc --fPIC -shared XXXXX -o XX XXXX

5。打包的.so 怎麼被調用:

把.so  像opencv 的。so一樣編譯就可以了。在 下面放上所有的.h 檔案

重新make

6。把 test_so 放到工控機下去測試,出現的問題是:

在目前的目錄下找不到 bobbin.so

可是我的相應目錄下明明有 bobbin.so

使用:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

把尋找。so 的檔案放在目前目錄下。

使用 ldd  Main  看看需要的。so 檔案是不是都在這個目錄下

發現opencv_core.so.2.4 不在這個目錄下。

解決方法是: 在LZQ的電腦下使用locate  opencv_core.so.2.4  可以找到所有opencv_core.so.2.4 的路徑。

把缺少的。so 檔案copy 到工控機下。

執行./Main 報錯 :bus error

目前bus error 無解 。目前我正在裝我電腦的ububtu 看移植到ubuntu 下是不是相同的問題。

GOD bless me