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<height_src;row++)
		for(int col=0;col<width_src;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<hist_size;i++)
	{
		float bin_val = cvQueryHistValue_1D(r_hist,i);
		fea[i] = bin_val;

	}
	for(int i = 0;i<hist_size;i++)
	{
		float bin_val = cvQueryHistValue_1D(g_hist,i);
		fea[i + 8] = bin_val;

	}

	for(int i = 0;i<hist_size;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






  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Basler相机是一种高质量的工业相机,常用于图像采集。它以瑞士Basler公司命名,具有高分辨率、高帧率和高灵敏度的特点。它能够在极短的时间内采集大量的图像数据。 Basler相机的采集过程类似于摄影,通过镜头对目标物体进行成像,并将所获得的图像数据转换为数字信号。相机的传感器负责将光线转化为电信号,并进行采集和处理。 Basler相机的采集质量与其传感器的像素数有着直接关系。像素数越高,图像的细节和清晰度就越好。由于Basler相机采用了先进的CMOS技术,因此在采集过程中产生的噪声较少,图像质量更加清晰。 为了取得准确和稳定的图像,Basler相机还可以进行自动曝光和自动对焦。自动曝光功能能够根据光线的强弱自动调整曝光时间,确保图像亮度适合观察和处理。自动对焦功能则能够根据目标物体的距离自动调整镜头的焦距,确保图像的清晰度和准确度。 在采集过程中,Basler相机还可以提供多种接口选项,如GigE、USB和Camera Link等,以满足不同应用的需求。相机还可以通过相关软件进行图像处理和分析,以提取目标物体的特征信息。 总的来说,Basler相机采集了高质量的图像数据,具有高分辨率、高帧率和高灵敏度的特点,并通过自动曝光和自动对焦等功能,保证了图像的清晰度和准确度。它可以应用于各种领域,如工业检测、医学影像和科学研究等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值