您的位置:首页 > 其它

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

2017-10-09 17:39 603 查看
最近发现有必要记录整理一下遇到的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个通道,则[b]Scalar(1,3)就是对该矩阵进行初始化赋值。第一个通道全为1,第2个通道全为3。[/b]

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 >(常用于图像特征点识别)

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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: