@@ -17,7 +17,6 @@ CameraWrapper::CameraWrapper(int exposure, int gain, int camera_mode, const std:
mode ( camera_mode ) ,
camera_cnts ( 2 ) ,
camera_status ( - 1 ) ,
iplImage ( nullptr ) ,
rgb_buffer ( nullptr ) ,
channel ( 3 ) ,
gain ( gain ) ,
@@ -27,9 +26,11 @@ CameraWrapper::CameraWrapper(int exposure, int gain, int camera_mode, const std:
void cameraCallback ( CameraHandle hCamera , BYTE * pFrameBuffer , tSdkFrameHead * pFrameHead , PVOID pContext ) {
CameraWrapper * c = ( CameraWrapper * ) pContext ;
CameraImageProcess ( hCamera , pFrameBuffer , c - > rgb_buffer , pFrameHead ) ;
auto iplImage = cvCreateImageHeader ( cvSize ( pFrameHead - > iWidth , pFrameHead - > iHeight ) , IPL_DEPTH_8U , c - > channel ) ;
cvSetData ( iplImage , c - > rgb_buffer , pFrameHead - > iWidth * c - > channel ) ; //此处只是设置指针,无图像块数据拷贝,不需担心转换效率
c - > src_queue . push ( cv : : cvarrToMat ( iplImage ) . clone ( ) ) ;
// 使用 cv::Mat 替代 IplImage
cv: : Mat img ( pFrameHead - > iHeight , pFrameHead - > iWidth ,
c - > channel = = 3 ? CV_8UC3 : CV_8UC1 ,
c - > rgb_buffer , pFrameHead - > iWidth * c - > channel ) ;
c - > src_queue . push ( img . clone ( ) ) ;
}
bool CameraWrapper : : init ( ) {
@@ -134,15 +135,9 @@ bool CameraWrapper::read(cv::Mat &src) {
bool CameraWrapper : : readRaw ( cv : : Mat & src ) {
if ( CameraGetImageBuffer ( h_camera , & frame_info , & pby_buffer , 500 ) = = CAMERA_STATUS_SUCCESS ) {
if ( iplImage ) {
cvReleaseImageHeader ( & iplImage ) ;
}
iplImage = cvCreateImageHeader ( cvSize ( frame_info . iWidth , frame_info . iHeight ) , IPL_DEPTH_8U , 1 ) ;
cvSetData ( iplImage , pby_buffer , frame_info . iWidth ) ; //此处只是设置指针,无图像块数据拷贝,不需担心转换效率
src = cv : : cvarrToMat ( iplImage ) . clone ( ) ;
// 使用 cv::Mat 替代 IplImage
cv: : Mat img ( frame_info . iHeight , frame_info . iWidth , CV_8UC1 , pby_buffer , frame_info . iWidth ) ;
src = img . clone ( ) ;
//在成功调用CameraGetImageBuffer后, 必须调用CameraReleaseImageBuffer来释放获得的buffer。
//否则再次调用CameraGetImageBuffer时, 程序将被挂起一直阻塞, 直到其他线程中调用CameraReleaseImageBuffer来释放了buffer
@@ -156,16 +151,13 @@ bool CameraWrapper::readRaw(cv::Mat &src) {
}
bool CameraWrapper : : readProcessed ( cv : : Mat & src ) {
// cerr << "Get-1" << endl;
if ( CameraGetImageBuffer ( h_camera , & frame_info , & pby_buffer , 500 ) = = CAMERA_STATUS_SUCCESS ) {
CameraImageProcess ( h_camera , pby_buffer , rgb_buffer ,
& frame_info ) ; // this function is super slow, better not to use it.
if ( iplImage ) {
cvReleaseImageHeader ( & iplImage ) ;
}
iplImage = cvCreateImageHeader ( cvSize ( frame_info . iWidth , frame_info . iHeight ) , IPL_DEPTH_8U , channel ) ;
cvSetData ( iplImage , rgb_buffer , frame_info . iWidth * channel ) ; //此处只是设置指针,无图像块数据拷贝,不需担心转换效率
src = cv : : cvarrToMat ( iplImage ) . clone ( ) ;
// 使用 cv::Mat 替代 IplImage
int mat_type = ( channel = = 3 ) ? CV_8UC3 : CV_8UC1 ;
cv : : Mat img ( frame_info . iHeight , frame_info . iWidth , mat_type , rgb_buffer , frame_info . iWidth * channel ) ;
src = img . clone ( ) ;
//在成功调用CameraGetImageBuffer后, 必须调用CameraReleaseImageBuffer来释放获得的buffer。
//否则再次调用CameraGetImageBuffer时, 程序将被挂起一直阻塞, 直到其他线程中调用CameraReleaseImageBuffer来释放了buffer
CameraReleaseImageBuffer ( h_camera , pby_buffer ) ;
@@ -193,4 +185,4 @@ CameraWrapper::~CameraWrapper() {
//注意, 先反初始化后再free
if ( rgb_buffer ! = nullptr )
free ( rgb_buffer ) ;
}
}