繁体   English   中英

线和对象的交点-Matlab

[英]intersection points of line and object - Matlab

我在硬币图像中用绿色标记了一个硬币(绿色),并在其上经过了一行。 如何找到它们相交的x,y点? 提前致谢。

在此处输入图片说明

clc;
clear; 

I = imread('coins.png'); 
BW = im2bw(I);

BW_filled = imfill(BW,'holes');

boundaries = bwboundaries(BW_filled);  
figure,imshow(I) ;

hold on;

b = boundaries{1}; 
plot(b(:,2),b(:,1),'g','LineWidth',1);

h = imline;
myPoints = wait(h);
delete(h)  ;
x1 = round(myPoints(1,1),2);
y1 = round(myPoints(1,2),2);
x2 = round(myPoints(2,1),2);
y2 = round(myPoints(2,2),2);

%plot line
x=[x1 x2];
y=[y1 y2];
plot(x',y','r')

查找直线和圆之间的交点。

k = abs( (b(:,2)-x1) * (y2-y1) - (b(:,1)-y1) * (x2-x1) );
[~,idx] = sort(k);
scatter(b(idx(1:2),2), b(idx(1:2),1))

这是一个简单的方法。 它捕获圆上的所有点,并根据直线方程式检查每个点。

理想情况下,我们有(x-x1) / (x2-x1) = (y-y1) / (y2-y1) ,或者说d = (x-x1) / (x2-x1) - (y-y1) / (y2-y1) ,然后d=0是理想情况。 当点偏离直线时, d的绝对值增加。 因此,最小d是指最接近直线的点。 在这种情况下,应该有两点,因此我正在寻找两个最小值。

一个可能的问题可能是准确性。 当圆上的点彼此相距较远时,最接近的两个点可能代表相同的交点,而另一个则未被检测到。 将应用更复杂的检查,例如,选择最接近的四个然后进行区分。 但是,可以通过保持较高的点密度来避免这种情况。


编辑:添加了这样的检查。

k = abs( (b(:,2)-x1) * (y2-y1) - (b(:,1)-y1) * (x2-x1) );
[~,idx] = sort(k);

f4x = b(idx(1:4),2);
f4y = b(idx(1:4),1);
choose = [1,2;1,3;1,4;2,3;2,4;3,4];
dist = sqrt( (f4x(choose(:,1))-f4x(choose(:,2))).^2 + ....
    (f4y(choose(:,1))-f4y(choose(:,2))).^2);
[~, idx2] = sort(dist,'descend');

px = b(idx(choose(idx2(1,:),:).'),2);
py = b(idx(choose(idx2(1,:),:).'),1);

scatter(px, py)

一些结果

>> idx(1:4)

ans =

    28
   112
   113
    29

>> dist

dist =

   55.7853
   55.5428
    1.0000
    1.0000
   55.5428
   55.3173

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM