opencv之常用还是忘,那咋办嘛
阅读原文时间:2023年07月15日阅读:2

相机标定:https://blog.csdn.net/y2c58s43d69g8h7G_g/article/details/97239418

畸变参数个数要是镜头太凸的话,就像鱼眼相机和哨兵150视角,就选3

FocalLength 焦距

PrincipalPoint 主点

RadialDistortion 径向畸变

TangentialDistortion 切向畸变

转xml代码:https://www.cnblogs.com/xingkongcanghai/p/11862534.html

writeXML(cameraParams,'cameraParams.xml');

Ubuntu自启动程序 gnome-session-properties

Rect tl()左上角点坐标 br()右下角点坐标

//切割ROI
Mat ROI = threshold_output(Rect(boundRect[i].tl(), boundRect[i].br()));

逼近多边形:approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);

返回外部矩形边界:boundRect[i] = boundingRect(Mat(contours[i]));//参数为输入的二维点集可以是vector或Mat类型

寻找最小包围矩形:RotatedRect minRect = minAreaRect(Mat(contours[i]));参数为输入的二维点集可以是vector或Mat类型

Point2f vertex[4];//用于存放最小矩形的四个顶点

minRect.points(vertex);//返回矩形的四个顶点给vertex

//绘制最小面积包围矩形

vectormin_rectangle;

for (int i = 0; i < 4; i++)

{

line(drawing, vertex[i], vertex[(i + 1) % 4], Scalar(255, 0, 0), 1, 8);//非常巧妙的表达式

min_rectangle.push_back(vertex[i]);//将最小矩形的四个顶点以Point的形式放置在vector容器中

}

最小包围圆:minEnclosingCircle(contours[i], center, radius);//寻找最小包围圆

circle(drawing, center, cvRound(radius), Scalar(0, 255, 0), 1, 8);//绘制最小包围圆,cvRound对半径进行四舍五入

    //找轮廓重心
                vector<Moments> mu(contours.size());
                mu[i] = moments(contours[i], false);
                double a = mu[i].m10 / mu[i].m00;
                double b = mu[i].m01 / mu[i].m00;
                //cout << i << "******" << "(" << a << "," << b << ")" << endl;
                Point p = Point(a, b);
                circle(drawing, p, 1, Scalar(0, 0, 255), 3, 8);//重心

寻找轮廓:

findContours(threshold_output, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0, 0));//RETR_EXTERNAL最外层

findContours(ROI, contoursROI, hierarchyROI, CV_RETR_TREE, CHAIN_APPROX_SIMPLE);//CV_RETR_TREE,所有

画轮廓:drawContours(drawingROI, contoursROI, j, Scalar(0, 0, 255), 2);//contoursROI到drawingROI

Atan2 函数介绍 atan2

原型:extern float atan2(float y, float x);

用法:#include

功能:求y/x(弧度表示)的反正切值.

在 istream 和 ifstream 类中有一个read成员函数,它可以用来读取使用 write 写入的二进制数据。它釆用了两个形参,一个是字节读取后将要存储的缓冲区的地址,另外一个是要读取的字节数:

read(addressOfBuffer, numberOfBytes)

输出错误cerr https://www.baidu.com/link?url=677fHjVKdf4C_SZ8IZzf5pFJDmFHr6ZCyn8VqDUta6dZCn3gbQm1E-Fi0UFO0BVAAzMxNsfxIw8JOJma1CrkUD1H5ucJ6fWIMUbkbpuEAbG&wd=&eqid=947da5540009e9ce000000025dfb565d

基于PNP方法的绝对位姿测量

https://www.jianshu.com/p/b97406d8833c

void solvePnP(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int flags = CV_ITERATIVE)

objectPoints - 世界坐标系下的控制点的坐标,vector的数据类型在这里可以使用

imagePoints - 在图像坐标系下对应的控制点的坐标。vector在这里可以使用

cameraMatrix - 相机的内参矩阵

distCoeffs - 相机的畸变系数

以上两个参数通过相机标定可以得到。相机的内参数的标定参见:http://www.cnblogs.com/star91/p/6012425.html

rvec - 输出的旋转向量。使坐标点从世界坐标系旋转到相机坐标系

tvec - 输出的平移向量。使坐标点从世界坐标系平移到相机坐标系

flags - 默认使用CV_ITERATIV迭代法

openCV中convertTo(转换)的用法:https://blog.csdn.net/haima1998/article/details/82079042

cmake -DCMAKE_BUILD_TYPE=Release ..

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章