基于opencv测量图片中物体的尺寸(matlab实现)

news2024/12/24 2:08:47

1、引言

问题重述
已知书本上右下角放一枚一元人民币(直径2.5厘米),请利用计算机视觉技术预测图片中目标的实际尺寸。

1.预测图片中书本的长与宽(单位:厘米)。

2.预测书本右上方用铅笔画的圆圈的外圆直径(单位:厘米)。

在这里插入图片描述

现有解决方案:

手动或自动地对已知物体进行标注和测量,得到其尺寸信息(例如像素大小)。 对图像进行预处理,包括灰度化、二值化、去除噪声等操作,以便更好地分割和识别图像中的物体。 利用物体检测或图像分割技术找到图像中待测物体的位置。 根据待测物体在图像中的像素大小和已知物体的像素大小之间的比例关系,计算出待测物体的实际尺寸。

2、解决方法

先对图片进行预处理,后进行高斯模糊(通过测试设置合理的阈值,从而得到较好的效果),通过闭运算增加边缘连通性,用来填充物体内的小空洞,连接断开的轮廓线,由于边缘检测出来的轮廓线通常是不完整的,我们就可以通过这种方法来加强边缘,得到完整的边缘。为了获取到我们书本的轮廓,我们要提取最大的轮廓。然后提取通过霍夫变换检测直线,求出书本轮廓的四条直线的角点,也就是书本的四个角(求角点的时候要进行筛选,筛选出符合要求的点)。再通过角点以及透视变换对图片进行矫正,具体思路是先求出投影映射矩阵:根据4个基准坐标,然后反求出源图像坐标:根据映射矩阵内参数,求一个二元一次方程组。得到矫正后的图片后我们同样要进行高斯模糊。之后我们对图片使用圆形 Hough 变换查找圆,找出最符合的两个圆,从而能求出书本的宽高和手画的圆的直径。

3.实验结果

书本边缘(显示角点):
在这里插入图片描述
透视变换后的图片:
在这里插入图片描述
Hough 变换查找圆,并画出来:
在这里插入图片描述
结果输出:
在这里插入图片描述

4、结论

本次实验运用了较多计算机视觉相关知识,本人能通过课堂所学结合个人想法完成本次实验要求,较符合个人预期,能通过矫正图片等创新方法使得结果更加准确。但也存在一些不足,例如对手画圆的检测并不能十分精准,精度还有待提高。

5、参考文献

[1]图像透视变换原理及现:https://blog.csdn.net/cuixing001/article/details/80261189
[2]透视变换的实现以及透视变换矩阵的构造: https://blog.csdn.net/overflow_1/article/details/80330835
[3]opencv实战–物体尺寸量:https://blog.csdn.net/mbtt00/article/details/107918654

6、具体代码如下:

% 读入图片并显示
img = imread('image.jpg');
%imshow(img);

% 缩小图片,方便处理
img = imresize(img, 0.5);

% 灰度化
grayImg = rgb2gray(img);

% 高斯模糊
blurImg = imgaussfilt(grayImg, 0.5); % 增加0.5个像素的模糊半径

% Canny边缘检测
edgeImg = edge(blurImg, 'Canny', [0.05, 0.15]); % 设置阈值0.05和0.15
%imshow(edgeImg);
% 闭运算,增加边缘连通性
se = strel('disk', 200); % 200像素大小的圆形结构元素
closedImg = imclose(edgeImg, se);
%imshow(closedImg);
% 提取轮廓
contourImg = bwperim(closedImg, 8); % 连续8个像素才能构成边缘
stats = regionprops(contourImg, 'BoundingBox', 'Area'); % 提取轮廓属性

% 霍夫变换检测直线
[H,T,R] = hough(contourImg);
P = houghpeaks(H, 50);
lines = houghlines(contourImg, T, R, P);

% 直线筛选
maxLength = 0;
longestLines = [];
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
% 计算直线长度
lineLength = norm(xy(1,:) - xy(2,:));
% 判断是否为最长直线
if lineLength > maxLength
longestLines(end+1) = k;
if length(longestLines) > 4
[~, idx] = min(lineLength);
longestLines(idx) = [];
end
maxLength = lineLength;
end
end

% 计算直线交点
corners = zeros(4,2);
idx = 1;
for i = 1:length(longestLines)
for j = i+1:length(longestLines)
xy1 = [lines(longestLines(i)).point1; lines(longestLines(i)).point2];
xy2 = [lines(longestLines(j)).point1; lines(longestLines(j)).point2];
intPoint = lineIntersect(xy1, xy2);
if(intPoint(1)<640)
if(intPoint(2)>0)
corners(idx,:) = intPoint;
idx = idx + 1;
end
end
end
end
imshow(contourImg);title('书本边缘(显示角点)');
hold on;
plot(corners(:,1), corners(:,2), 'ro', 'MarkerSize', 10); % 显示角点
%plot(xy1(:,1),xy1(:,2),'LineWidth',1,'Color','red');
%plot(xy2(:,1),xy2(:,2),'LineWidth',1,'Color','green');
% 找到最大的轮廓,即书本的轮廓
[~, idx] = max([stats.Area]);
bookBox = stats(idx).BoundingBox;




disp(size(corners)) 

% 获取书本轮廓的图像并进行矫正
%bookContour = imcrop(img, bookBox);

% 显示矫正后的图像
%figure;

%imshow(bookContour);




[m,n] = size(grayImg);
dot=corners; %取四个点,依次是左上,右上,左下,右下
dot(:,[1,2])= dot(:,[2,1]); % 变换x y坐标,x=行 y=列
col=round(sqrt((dot(1,1)-dot(2,1))^2+(dot(1,2)-dot(2,2))^2)); %从原四边形获得新矩形宽
row=round(sqrt((dot(1,1)-dot(3,1))^2+(dot(1,2)-dot(3,2))^2)); %从原四边形获得新矩形高
new_img = ones(row,col);
% 原图四个基准点的坐标
x = [dot(1,1),dot(2,1),dot(3,1),dot(4,1)];
y = [dot(1,2),dot(2,2),dot(3,2),dot(4,2)];
% 新图四个基准点坐标
X = [1,1,row,row];
Y = [1,col,1,col];
% 列出投影关系 求出投影矩阵
A=[x(1),y(1),1,0,0,0,-X(1)*x(1),-X(1)*y(1); 
0,0,0,x(1),y(1),1,-Y(1)*x(1),-Y(1)*y(1);
x(2),y(2),1,0,0,0,-X(2)*x(2),-X(2)*y(2);
0,0,0,x(2),y(2),1,-Y(2)*x(2),-Y(2)*y(2);
x(3),y(3),1,0,0,0,-X(3)*x(3),-X(3)*y(3);
0,0 ,0,x(3),y(3),1,-Y(3)*x(3),-Y(3)*y(3);
x(4),y(4),1,0,0,0,-X(4)*x(4),-X(4)*y(4);
0,0,0,x(4),y(4),1,-Y(4)*x(4),-Y(4)*y(4)];%求解变换矩阵的行列式
B = [X(1),Y(1),X(2),Y(2),X(3),Y(3),X(4),Y(4)]';
C = inv(A)*B;
D = [C(1),C(2),C(3);
C(4),C(5),C(6);
C(7),C(8),1]; % 变换矩阵3*3模式
inv_D = inv(D);
for i = 1:row 
for j = 1:col
% 解二元一次方程组,根据目标图像坐标反求出原图坐标
pix = inv_D * [i j 1]';
pix1 = inv([C(7)*pix(1)-1 C(8)*pix(1);C(7)*pix(2) C(8)*pix(2)-1])*[-pix(1) -pix(2)]';
if pix1(1)<m && pix1(2)<n
new_img(i,j) = img(round(pix1(1)),round(pix1(2))); %最近邻插值
else
new_img(i,j) = 255;
end
end
end 

figure;
new_img=flipud(new_img);%上下翻转
%图像归一化
Bmax=max(max(new_img));
Bmin=min(min(new_img));
new_img=(new_img-Bmin)/(Bmax-Bmin);
imshow(new_img);title('透视变换后')
new_img = imgaussfilt(new_img, 2);
new_img=edge(new_img, 'Canny', [0.05, 0.15]); % 设置阈值0.05和0.15
figure;
imshow(new_img);title('边缘检测')
[centers,radii,metric] = imfindcircles(new_img,[20,500])
centersStrong2 = centers(1:2,:); 
radiiStrong2 = radii(1:2);
metricStrong2 = metric(1:2);
viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');
%长为A,宽为B
[A,B]=size(new_img);
A=(A/radiiStrong2(1,1)*0.5)*2.5;
B=(B/radiiStrong2(1,1)*0.5)*2.5;
%外圆直径
W=(radiiStrong2(2,1)/radiiStrong2(1,1))*2.5;
disp('书本宽为:'+string(B)+'cm'+',书本长为:'+string(A)+'cm');
disp('铅笔所画的圆的外圆直径为:'+string(W)+'cm');



function intPoint = lineIntersect(line1, line2)
% 计算两条直线的交点
% line1: 直线1的两个端点坐标,[x1,y1; x2,y2]
% line2: 直线2的两个端点坐标,[x3,y3; x4,y4]

% 计算直线参数
A1 = line1(1,2) - line1(2,2);
B1 = line1(2,1) - line1(1,1);
C1 = line1(1,1)*line1(2,2) - line1(2,1)*line1(1,2);

A2 = line2(1,2) - line2(2,2);
B2 = line2(2,1) - line2(1,1);
C2 = line2(1,1)*line2(2,2) - line2(2,1)*line2(1,2);

% 计算交点
D = A1*B2 - A2*B1;
if D ~= 0
x = (B1*C2 - B2*C1) / D;
y = (A2*C1 - A1*C2) / D;
intPoint = [x, y];
else
intPoint = [nan, nan];
end
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cocos Creator:AR 交互

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 Cocos Creator&#xff1a;AR 交互 3D工具集&#xff1a; NSDT简石数字孪生 AR 交互 AR 交互主要由 cc.ScreenTouchInteractor 组件驱动&#xff0c;该组件将触摸事件转换为点击、拖拽和捏合等手势&#xff0c;交互器将这…

SciencePub学术 | 信号处理类重点SCIEI征稿中

SciencePub学术 刊源推荐: 信号处理类重点SCI&EI征稿中&#xff01;影响因子高&#xff0c;自引率低&#xff0c;对国人非常友好。信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 信号处理类重点SCI&EI &#x1f4cc;【期刊简介】IF&#xff1…

RTK 定位回传数据转内网(局域网)mqtt协议--- 格林恩德 CR102 RTK 针对无人机巡检应用

先简单介绍一下CR102 格林RTK高精度设备&#xff0c;CR102接收机&#xff0c;集成高精度模组与4G&#xff0c; WIFI/蓝牙通信模组&#xff1b;双天线定位定向&#xff0c; 同时内置惯导&#xff0c; 输出加速度和姿态信息。支持4G/WIFI/蓝牙无线传输、 LAN网口传输&#xff1b;…

案例研究|中国矿业大学基于JumpServer构建运维安全体系

中国矿业大学是教育部直属的全国重点高校&#xff0c;是教育部、应急管理部与江苏省人民政府共建高校&#xff0c;先后进入国家“211工程”“985优势学科创新平台项目”和国家“双一流”建设高校行列&#xff0c;学校现坐落于素有“五省通衢”之称的国家历史文化名城——江苏省…

Java实训第七天——2023.6.13

文章目录 一、用Visual Studio Code写一个计算器二、同一个js被多个html引用三、js操作css四、DOM对象属性的操作案例五、js解析json 一、用Visual Studio Code写一个计算器 功能&#xff1a;实现简单的加减乘除 <!DOCTYPE html> <html lang"en"> <…

如何录制声音?推荐这2款电脑录音软件!

案例&#xff1a;怎么录制电脑上的声音&#xff1f;在电脑上怎么录制自己的声音&#xff1f;有没有小伙伴知道操作的步骤。 【我想录制语音会议&#xff0c;还想录制自己的歌声&#xff0c;在电脑上如何录制声音&#xff1f;求一个简单易懂的教程&#xff0c;在线等&#xff0…

使用ReactPy报错:RuntimeError: No built-in server implementation installed.解决

目录 一、问题呈现二、问题原因及解决办法三、处理结果 一、问题呈现 在初次运行ReactPy报错raise RuntimeError("No built-in server implementation installed.") RuntimeError: No built-in server implementation installed.具体报错信息如下&#xff1a; D:\i…

小程序快速渲染机制及双线程技术解析

不管我们对于小程序这种形态存在何种质疑&#xff0c;但不可否认已经融入到我们生活的方方面面&#xff0c;出门打车、扫码、点外卖甚至收能量等等操作都是以小程序进行承载。背后的缘由是小程序足够轻量、便捷、跨平台等特点&#xff0c;为用户提供了丰富的功能和优质的用户体…

作为一个优秀的项目经理,你需要做什么?

经常看到这样的项目经理&#xff0c;一副整天忙得团团转的样子&#xff0c;整天忙得团团转&#xff0c;发出一大堆指令&#xff0c; 经常事无巨细都要亲自过问&#xff0c;他还会不断抱怨说&#xff1a; " 我很忙 " 或 " 我很累 " &#xff0c; " 我…

大厂最全1100道Java面试题及答案整理(2023最新版)

前言 春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们 Java 程序员的面试之路&#xff0c;是挺难的&#xff0c;过了 HR&#xff0c;还得被技术面&#xff0c;小刀在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终…

5、alibaba微服务nacos的引入和使用

1、项目中引入nacos 父项目中已经引入了spring-cloud-alibaba&#xff0c;这个里面就已经包含nacos依赖了&#xff0c;所以在子项目中引入nacos依赖不用添加版本信息 <dependencies><dependency><groupId>org.springframework.boot</groupId><arti…

Java创建线程的两种方式和线程的生命周期

方式一&#xff1a;继承Thread类的方式&#xff1a; 创建一个继承于Thread类的子类 重写Thread类的run() --> 将此线程执行的操作声明在run()中 创建Thread类的子类的对象 通过此对象调用start()&#xff1a;①启动当前线程 ② 调用当前线程的run() 说明两个问题&#…

Python3数据分析与挖掘建模(12)多因子:复合分析-相关分析与实现示例

1. 相关分析 1.1 概述 相关分析是一种统计分析方法&#xff0c;用于研究两个或多个变量之间的关系和相互影响程度。它帮助我们了解变量之间的线性关系、趋势和相关程度。 在相关分析中&#xff0c;常用的指标是相关系数&#xff0c;用于衡量两个变量之间的相关程度。最常见的…

Linux之文件一般权限

目录 Linux之文件一般权限 文件和目录的一般权限 解析&#xff1a; 文件类型 文件的权限针对三类对象进行定义 文件针对每类访问者定义的三种权限 对于文件和目录&#xff0c;r&#xff0c;w&#xff0c;x的作用以及含义 设置文件和目录的一般权限 修改文件或目录权限 ---…

论文可视化分析神器——CiteSpace和vosviewer

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

MySQL启停要十分钟?

一、问题背景 基础环境&#xff1a; 主机类型&#xff1a;x3850 X6 操作系统&#xff1a;DB:Red Hat Enterprise Linux 9.1 7.8 存储&#xff1a;IBM存储&#xff0c;500GB 内存&#xff1a;64 G CPU型号&#xff1a;E7-4830 v3 2.10GHz CPU核数&#xff1a;32CORE 数据…

洞察丨挖掘游戏行为数据价值的 6 个新思路

现阶段&#xff0c;游戏赛道越来越难&#xff0c;主要表现在玩家对游戏质量的要求提高、游戏立项选择空间变小、游戏买量越来越贵且回本周期越来越长……与此同时&#xff0c;游戏出海势头依然强劲&#xff0c;难以突破重围。 可以说&#xff0c;几乎所有的游戏都在尽可能地朝着…

便利店小程序怎么做

便利店小程序是一种基于移动互联网的购物平台&#xff0c;它为用户提供了便捷的购物体验&#xff0c;可以满足用户的购物需求。下面是便利店小程序的主要功能介绍&#xff1a; 1. 商品展示&#xff1a;便利店小程序可以展示商家的商品信息&#xff0c;包括商品图片、价格、描述…

【什么是iMessage推送,im群发】苹果推iMessage是苹果公司为其设备用户提供的即时通讯服务

iMessage是苹果公司为其设备用户提供的即时通讯服务&#xff0c;拥有一系列强大的功能和特点。然而&#xff0c;至今为止&#xff0c;苹果并未提供官方的群发部署功能。iMessage主要被设计为点对点的通信工具&#xff0c;即用户可以与一个或多个人进行私密的聊天对话。以下是关…