目标跟踪检测算法(一)——传统方法

目标跟踪检测算法(一)——传统方法,第1张

1 确认光学系统的性能,复原相机模型的3D空间至2D空间的一一对应关系。

  标定的作用其一就是为了求取畸变系数(因为经过镜头等成像后,或多或少都有畸变),其二是为了得到空间坐标系和图像坐标系的对应关系。

2 定位精度高达0001mm;

3 经典棋盘格标定板,实心圆阵列标定板,halcon标定板可兼容于大多数图像处理算法 的标定算法。

下面以halcon标定板为例:

halcon标定板兼容德国MVtech公司的Halcon和ActiveVision Tools机器视觉软件开发包。外围带边框和一个斜角,7x7圆点矩阵

以6060mm的规格举例:

77阵列                             

外边框长度:60mm60mm

内边框长度:58125mm58125mm

即:黑色边框线为一个圆点半径1875(直径是375)

黑色圆点直径:375mm

圆点中心间距:750mm

边角:由黑色外边框向内缩进一个中心边距的长度(750mm)

这个就是halcon标定描述文件生成的一个的标定板规格

Open CV标定板像素尺寸的完全解释内容如下:在使用opencv处理视频流时,通常要对读取到的图像进行尺寸设置,以便于后续图像处理和算法设计。OpenCV读取视频的类VideoCapture的接口函数VideoCapture::set(int id,double value)可以对图像尺寸进行设置。但当我们随意设置一个尺寸后,再输出图像的行和列,会发现输出的行列和我们设置的行列并不同。如有下列程序:

#include<iostream>

#include<opencv2/opencvhpp>

using namespace std;

using namespace cv;

int main()

{

//当主机只连接一个摄像头时默认编号为0

VideoCapture cap(0);

//想要得到大小为780×460的图像

capset(CAP_PROP_FRAME_WIDTH, 780);

capset(CAP_PROP_FRAME_HEIGHT, 460);

while(1)

{

Mat orgImage;

cap >> orgImage;

cout << "图像行为: " << orgImagerows << "\n" << "图像列为: " << orgImagecols << endl;

//摄像头断开连接时程序结束

if (orgImageempty())

break;

}

return 0;

}

这时我们期待输出为:

图像行为:460

图像列为:780

但实际上输出为:

图像行为:448

图像列为:800

原因分析:

产生这种结果是因为,set()设置的像素尺寸并不是有无限多种,而是只在其规定的几种尺寸里(可以人为它有一个尺寸容器,容器里只包含若干个尺寸供人们选择)选择输出,输出的最终结果基于我们人为在set里填写的数字大小,根据我们输入的尺寸,在“尺寸容器”中选择最接近的一个尺寸作为图像的实际输出尺寸。例如默认尺寸为(default_width, default_height),而我们设置的尺寸为(input_width, input_height),这时会选择满足(|input_width-default_width|+|input_height-default_height|)值最小的默认的一对尺寸成为最终输出尺寸。

经本人测试,set()函数只有11种像素尺寸,分别为:

(160,120);(320,240);(352,288);

(424,240);(640,360);(640,480);

(800,448);(800,600);(960,544);

(1280,720);(1920,1080);

复制

现在可以回答一开始的问题,当我们设置尺寸为(780,460),按上述公式计算(800,448)这组默认尺寸满足最小值要求,所以输出尺寸为(800,448)。

解决方案:

那么如果我们就是想要默认尺寸里没有的某个任意像素尺寸呢?opencv里还有一个函数就可以解决这个问题,即resize()函数。其函数原型为:

CV_EXPORTS_W void resize( InputArray src, OutputArray dst,Size dsize, double fx=0,

double fy=0,int interpolation=INTER_LINEAR );

复制

其中src为输入图像;

dst为尺寸改变后的输出图像;

dsize为输出尺寸,当输入为0时,fx、fy不可均为0,dsize = Size(round(fxsrccols),round(fysrcrows));

fx为水平缩放比例,当输入为0时,fx=(double)dsizewidth/srccols;

fy为垂直缩放比例,当输入为0时,fy=(double)dsizeheight/srcrows;

interpolation为内插方式,内插方式有:

a) CV_INTER_NEAREST 最邻近插值点法

b) CV_INTER_LINEAR 双线性插值法

c)CV_INTER_AREA 邻域像素再取样插补

d)CV_INTER_CUBIC 双立方插补,44大小的补点

所以,通过set()和resize()的搭配使用就可以设置任意大小的图像尺寸,如我想得到一个400×400的图像,即可通过代码实现结果了。祝您生活愉快,谢谢提问

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9790934.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存