cv下的常用类、函数笔记(持续更新中)

来源:互联网 发布:java 中map的put用法 编辑:程序博客网 时间:2024/05/18 15:23

最近发现有必要记录整理一下遇到的cv库里的函数,所以开了这一章。


1、LK光流法程序

  

cv::circle(img_show, kp, 10, cv::Scalar(0,240, 0), 1);

参数一:img_show  要画哪副图

参数二:kp 每个圆的圆心位置

参数三:10 每个圆的半径(radius)

参数四:cv::Scalar(0,240, 0)   图像矩阵三通道赋值

参数五:1 所画的圆的外边缘宽度

引申出同类问题

OpenCV画椭圆、实心圆、凹多边形、线段、矩形

http://blog.csdn.net/lql0716/article/details/54980921

此外,Scalar是对图像对应的多通道矩阵进行初始化赋值,例如:图像对应的矩阵元素为类型为CV_32F表示有2个通道,则Scalar(1,3)就是对该矩阵进行初始化赋值。第一个通道全为1,第2个通道全为3。


2、

ushort d = depth.ptr<ushort> ( cvRound ( kp.pt.y ) ) [ cvRound ( kp.pt.x ) ]

参数一:cvRound 一种数据处理函数,对double类型的数据进行四舍五入

参数二:kp.pt.y 特征点kp的点坐标pt的横坐标y

引申出同类问题

a、数据处理函数

  floor  函数,向下取整

b、

OpenCV Mat数据类型指针ptr的使用

    cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600    uchar * data00 = image.ptr<uchar>(0);    uchar * data10 = image.ptr<uchar>(1);    uchar * data01 = image.ptr<uchar>(0)[1];
  • 1
  • 2
  • 3
  • 4

解释:

  • 定义了一个Mat变量image。
  • data00是指向image第一行第一个元素的指针。
  • data10是指向image第二行第一个元素的指针。
  • data01是指向image第一行第二个元素的指针。

3、

cv::cvtColor ( color, gray, cv::COLOR_BGR2GRAY )
函数作用:把彩色图转化成灰度图

参数一:color  待转化的原图片文件

参数二:gray   转化后的灰度图的文件名

参数三:cv作用域下的宏,COLOR BGR2GRAY =6


4、


cv::Mat img_show ( color.rows*2, color.cols, CV_8UC3 );prev_color.copyTo ( img_show ( cv::Rect ( 0,0,color.cols, color.rows ) ) );color.copyTo ( img_show ( cv::Rect ( 0,color.rows,color.cols, color.rows ) ) );for ( Measurement m:measurements ){    if ( rand() > RAND_MAX/5 )        continue;    Eigen::Vector3d p = m.pos_world;    Eigen::Vector2d pixel_prev = project3Dto2D ( p ( 0,0 ), p ( 1,0 ), p ( 2,0 ), fx, fy, cx, cy );    Eigen::Vector3d p2 = Tcw*m.pos_world;    Eigen::Vector2d pixel_now = project3Dto2D ( p2 ( 0,0 ), p2 ( 1,0 ), p2 ( 2,0 ), fx, fy, cx, cy );    if ( pixel_now(0,0)<0 || pixel_now(0,0)>=color.cols || pixel_now(1,0)<0 || pixel_now(1,0)>=color.rows )        continue;    float b = 0;    float g = 250;    float r = 0;    img_show.ptr<uchar>( pixel_prev(1,0) )[int(pixel_prev(0,0))*3] = b;    img_show.ptr<uchar>( pixel_prev(1,0) )[int(pixel_prev(0,0))*3+1] = g;    img_show.ptr<uchar>( pixel_prev(1,0) )[int(pixel_prev(0,0))*3+2] = r;    img_show.ptr<uchar>( pixel_now(1,0)+color.rows )[int(pixel_now(0,0))*3] = b;    img_show.ptr<uchar>( pixel_now(1,0)+color.rows )[int(pixel_now(0,0))*3+1] = g;    img_show.ptr<uchar>( pixel_now(1,0)+color.rows )[int(pixel_now(0,0))*3+2] = r;    cv::circle ( img_show, cv::Point2d ( pixel_prev ( 0,0 ), pixel_prev ( 1,0 ) ), 4, cv::Scalar ( b,g,r ), 2 );    cv::circle ( img_show, cv::Point2d ( pixel_now ( 0,0 ), pixel_now ( 1,0 ) +color.rows ), 4, cv::Scalar ( b,g,r ), 2 );}cv::imshow ( "result", img_show );
这段代码的作用:建立一个图像矩阵——img_show,然后作为一张图片输出


第一行:新建一个图像矩阵img_show,参数设置为 行数图片color的两倍,列数和color一致,矩阵元素的数据类型为为三通道无符号数

第二行:步骤一:先在图像矩阵img_show 中开辟一块矩形区域(实际为图像矩阵的上半部分)

    步骤二:把prev_color中的数据复制到开辟好的这部分区域中

第三行:把color中的数据复制到剩余的下半部分区域中

第四行:(for循环)模块——

    步骤一:p是世界坐标系下位置已知的点,通过计算得到了该点在参考帧和当前帧中的像素坐标

    步骤二:把得到的像素坐标的三个通道重新设置,绿色拉满

    步骤三:在参考帧和当前帧画圆,以显示出已知点p的位置

最后一行:把已经设置好的img_show输出,输出对话框为result。


5、

cv::imshow ( "image", img_show );cv::moveWindow("image",1000,0);

移动窗口的位置——cv:moveWindow
用法就是跟在imshow函数后面加一句就可以了,作用就是重新设定一下要显示的窗口的位置(如下所示)




××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

下面是常用的cv类:

1、

vector < cv::Point3f >(空间点三维坐标)

2、

vector < cv::KeyPoint >(常用于图像特征点识别)




另外,恭喜通哥,新婚快乐

 
阅读全文
0 0