如何用opencv提取要检测工件的尺寸?

如何用opencv提取要检测工件的尺寸?,第1张

可以燃脊毁先提取轮廓cvFindContours,得到轮廓外接矩形CvRect r = ((CvContour*)cont)->rect,

矩形皮备长宽就是工件的长宽r.width和r.height 

可以用形态学 *** 作来去噪野侍

使用OpenCV测量图像物体的大小

图像目标尺寸检测类似于计算从我们的相机到一个物体的距离——在这两种情况下,我们都需要事先定义一个比率来测量每个给定度量单位的像素数(pixels_per_metric)。在这里所说的这个被称为“pixels_per_metric”的比率指标,我在接下来的部分中对其更正式的定义。

pixels_per_metric

为了确定图像中物体的大小,我们首先需要使用一个参照伏蠢物作为“校准”点。我们的参照物应该有两个重要的属性:

我们应该知道这个物体的真实尺寸(在宽度或高度上的毫米或英寸等值的大小)。

我们应该能够轻松地在图片中找到这个参照物,要么基于参照物的位置(如,参照物可以是一副图像中左上角的物体)或基于参照物的外表(例如参照物可以是图片中具有最独特的颜色或独一无二的形状,不同于所有其他的物体)。

在任何一种情况下,我们的参考应该以某种方式唯一可识别。

在这个例子中,我们将使用美分硬币作为我们的参照物,并且在所有示例中,确保它始终是我们图像中最左边的对象。

图1:我们将使用美分硬币作为参照贺厅清物,并确保它始终处于图像最左侧位置,这使得我们可以通过对它们位置的轮廓大小进行排序,进一步来提取信息。

通过保证美分硬币是最左边的物体,我们可以从左到右对我们的物体等高线区域进行排列,抓住这个硬币(它将始终对应于排序列表中的第一个等高线区域)。并使用它来定义我们的pixels_per_metric比率,我们将其定义为:

pixels_per_metric =物体像素宽 / 物体真实宽

美分硬币的真实宽度是0.955英寸。现在,假设我们图像中硬币的像素禅前宽为150像素(基于它的相关边界框)。那么这种情况下pixels_per_m

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

#include<iostream>

#include<opencv2/opencv.hpp>

using namespace std

using namespace cv

int main()

{

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

VideoCapture cap(0)

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

cap.set(CAP_PROP_FRAME_WIDTH, 780)

cap.set(CAP_PROP_FRAME_HEIGHT, 460)

while(1)

{

Mat orgImage

cap >>orgImage

cout <<"图像行为: " <<orgImage.rows <<"\n" <<"图像列为: " <<orgImage.cols <<endl

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

if (orgImage.empty())

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(fxsrc.cols),round(fysrc.rows));

fx为水平缩放比例,当输入为0时,fx=(double)dsize.width/src.cols;

fy为垂直缩放比例,当输入为0时,fy=(double)dsize.height/src.rows;

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

a). CV_INTER_NEAREST 最邻近插值点法

b). CV_INTER_LINEAR 双线性插值法

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

d).CV_INTER_CUBIC 双立方插补,4*4大小的补点

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

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

原文地址: https://outofmemory.cn/yw/12380682.html

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

发表评论

登录后才能评论

评论列表(0条)

保存