700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 关于在海康威视工业相机中进行二次开发和手眼标定的笔记

关于在海康威视工业相机中进行二次开发和手眼标定的笔记

时间:2018-08-15 17:31:31

相关推荐

关于在海康威视工业相机中进行二次开发和手眼标定的笔记

内容

1.虚拟机下 ubuntu16.04+opencv3.2+opencv_contrib编译安装2.通过图像的指针读取图像3.在Qt中查看某一个文件是否存在4.关于cvCvtColor()函数5.Mat::reshape()的用法6.QT 对文件的操作(创建、拷贝、写入、删除)

1.虚拟机下 ubuntu16.04+opencv3.2+opencv_contrib编译安装

/weixin_43053387/article/details/85806344

2.通过图像的指针读取图像

问题描述:

在项目开发的过程中,遇到了一个API,如下:

int Landmarklib::FindLandMark(unsigned char *image, Posture_d &pos, int &mark_idx)

上面函数中,第一个参数为输入参数,第二和第三个参数为输出参数。

第一个参数如何输入图像呢?

我的图像是通过Mat进行读取保存的,Mat src_image = imread("test.bmp");

直接传入src_image是错误的,后查询相关资料解决方法如下:通过OpenCV的Mat数据类型的data项

data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (unsigned char* data)

int index;Posture_d pos;landmark.FindLandMark(src_image.data, pos, index);

3.在Qt中查看某一个文件是否存在

问题:在测试通过相机读取图像时,需要对保存的图像进行后续的操作,由于线程的使用错误,图像还未保存时,后续处理的函数已经开始运行了,所以导致图像并未传进去,但程序也不报错。

解决:通过QFile::exists()函数查看当前文件是否存在

qDebug() << QFile::exists("×××"); //查看当前文件是否存在

4.关于cvCvtColor()函数

问题:将相机采集到的图像通过 QLabel进行显示。有的是彩色相机,采集到的图像是三通道的,有的是黑白相机图像是单通道的。

函数形式:void cvCvtColor( const CvArr* src, CvArr* dst, int code );

功能:cvCvtColor是opencv库中的一个函数,实现色彩空间转换。

参数列表:src:源图像(输入的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像)dst:目标图像(输入的 8-bit , 16-bit 或 32-bit 单倍精度浮点数影像)code:RGB <--> BGR:CV_BGR2BGRA、CV_RGB2BGRA、CV_BGRA2RGBA、CV_BGR2BGRA、CV_BGRA2BGRRGB <--> 5X5:CV_BGR5652RGBA、CV_BGR2RGB555、(以此类推,不一一列举)RGB <---> Gray:CV_RGB2GRAY、CV_GRAY2RGB、CV_RGBA2GRAY、CV_GRAY2RGBARGB <--> CIE XYZ:CV_BGR2XYZ、CV_RGB2XYZ、CV_XYZ2BGR、CV_XYZ2RGBRGB <--> YCrCb(YUV) JPEG:CV_RGB2YCrCb、CV_RGB2YCrCb、CV_YCrCb2BGR、CV_YCrCb2RGB、CV_RGB2YUV(将YCrCb用YUV替代都可以)RGB <--> HSV:CV_BGR2HSV、CV_RGB2HSV、CV_HSV2BGR、CV_HSV2RGBRGB <--> HLS:CV_BGR2HLS、CV_RGB2HLS、CV_HLS2BGR、CV_HLS2RGBRGB <--> CIE L*a*b*:CV_BGR2Lab、CV_RGB2Lab、CV_Lab2BGR、CV_Lab2RGBRGB <--> CIE L*u*v:CV_BGR2Luv、CV_RGB2Luv、CV_Luv2BGR、CV_Luv2RGBRGB <--> Bayer:CV_BayerBG2BGR、CV_BayerGB2BGR、CV_BayerRG2BGR、CV_BayerGR2BGR、CV_BayerBG2RGB、CV_BayerGB2RGB、 CV_BayerRG2RGB、CV_BayerGR2RGB(在CCD和CMOS上常用的Bayer模式)YUV420 <--> RGB:CV_YUV420sp2BGR、CV_YUV420sp2RGB、CV_YUV420i2BGR、CV_YUV420i2RGB

OpenCV默认图片通道顺序是BGR,而不是RGB。

解决:对于黑白、彩色图像进行分别处理

void Widget::display_myImage_L(const Mat *imagePrt){cv::Mat rgb;//判断是黑白、彩色图像QImage QmyImage_L;if (myImage_L->channels() > 1) {cv::cvtColor(*imagePrt, rgb, CV_BGR2RGB);QmyImage_L = QImage((const unsigned char *)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888);} else {cv::cvtColor(*imagePrt, rgb, CV_GRAY2RGB);QmyImage_L = QImage((const unsigned char *)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888);}QmyImage_L = (QmyImage_L).scaled(ui->lbl_camera_L->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); //饱满填充}

5.Mat::reshape()的用法

在阅读姿态估计的代码中,有这样一段:

vector<double> camera = {5491.0785, 0, 1207.4733, 0, 5472.8426, 1005.3919, 0, 0, 1 };cameraMatrix = Mat(camera);cameraMatrix = cameraMatrix.reshape(1, 3);

看到这挺纳闷的,camera是相机的内参矩阵中有9个参数,reshape(1, 3)不是将其变为1×3的矩阵嘛,这也不符啊,查阅资料后知道这里的reshape和np.reshape搞混了。

reshape函数既可以改变通道数,又可以对矩阵元素进行序列化。

函数原型:

C++: Mat Mat::reshape(int cn,int rows=0) const

cn:表示通道数(channels),如果设置为0,则表示通道不变;如果设置为其他数字,表示要设置的通道数。

rows:表示矩阵行数,如果设置为0,则表示保持原有行数不变,如果设置为其他数字,表示要设置的行数。

6.QT 对文件的操作(创建、拷贝、写入、删除)

/?id=1013

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。