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

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

https://blog.csdn.net/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_BGRA2BGR
RGB <--> 5X5:CV_BGR5652RGBA、CV_BGR2RGB555、(以此类推,不一一列举)
RGB <---> Gray:CV_RGB2GRAY、CV_GRAY2RGB、CV_RGBA2GRAY、CV_GRAY2RGBA
RGB <--> CIE XYZ:CV_BGR2XYZ、CV_RGB2XYZ、CV_XYZ2BGR、CV_XYZ2RGB
RGB <--> YCrCb(YUV) JPEG:CV_RGB2YCrCb、CV_RGB2YCrCb、CV_YCrCb2BGR、CV_YCrCb2RGB、CV_RGB2YUV(将YCrCb用YUV替代都可以)
RGB <--> HSV:CV_BGR2HSV、CV_RGB2HSV、CV_HSV2BGR、CV_HSV2RGB
RGB <--> HLS:CV_BGR2HLS、CV_RGB2HLS、CV_HLS2BGR、CV_HLS2RGB
RGB <--> CIE L*a*b*:CV_BGR2Lab、CV_RGB2Lab、CV_Lab2BGR、CV_Lab2RGB
RGB <--> CIE L*u*v:CV_BGR2Luv、CV_RGB2Luv、CV_Luv2BGR、CV_Luv2RGB
RGB <--> 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 对文件的操作(创建、拷贝、写入、删除)

http://www.skcircle.com/?id=1013

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boss-dog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值