Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何检查一个点是否在一组等值线内

如何检查一个点是否在一组等值线内
EN

Stack Overflow用户
提问于 2017-11-16 10:57:33
回答 1查看 3.2K关注 0票数 0

大家好。上面的图像是两幅图像的总和,其中我做了特征匹配,并绘制了所有匹配点。我还在第一个图像中找到了pcb部件的轮廓(半左图像-3个等高线)。问题是,我怎么能只画出第一幅图像中的等高线内的匹配点,而不是这样的蓝色混乱呢?我使用python2.7和opencv 2.4.12。

我在opencv 2.4.12中为绘制匹配函数编写了一个函数,但没有实现任何方法。如果我没有包括一些东西请告诉我。提前谢谢你!

代码语言:javascript
运行
AI代码解释
复制
import numpy as np
import cv2

def drawMatches(img1, kp1, img2, kp2, matches):

    # Create a new output image that concatenates the two images
    # (a.k.a) a montage
    rows1 = img1.shape[0]
    cols1 = img1.shape[1]
    rows2 = img2.shape[0]
    cols2 = img2.shape[1]

    # Create the output image
    # The rows of the output are the largest between the two images
    # and the columns are simply the sum of the two together
    # The intent is to make this a colour image, so make this 3 channels
    out = np.zeros((max([rows1,rows2]),cols1+cols2,3), dtype='uint8')

    # Place the first image to the left
    out[:rows1,:cols1] = np.dstack([img1, img1, img1])

    # Place the next image to the right of it
    out[:rows2,cols1:] = np.dstack([img2, img2, img2])

    # For each pair of points we have between both images
    # draw circles, then connect a line between them
    for mat in matches:

        # Get the matching keypoints for each of the images
        img1_idx = mat.queryIdx
        img2_idx = mat.trainIdx

        # x - columns
        # y - rows
        (x1,y1) = kp1[img1_idx].pt
        (x2,y2) = kp2[img2_idx].pt

        # Draw a small circle at both co-ordinates
        # radius 4
        # colour blue
        # thickness = 1
        cv2.circle(out, (int(x1),int(y1)), 4, (255, 0, 0), 1)
        cv2.circle(out, (int(x2)+cols1,int(y2)), 4, (255, 0, 0), 1)

        # Draw a line in between the two points
        # thickness = 1
        # colour blue
        cv2.line(out, (int(x1),int(y1)), (int(x2)+cols1,int(y2)), (255,0,0), 1)


    # Show the image
    cv2.imshow('Matched Features', out)
    cv2.imwrite("shift_points.png", out)
    cv2.waitKey(0)
    cv2.destroyWindow('Matched Features')

    # Also return the image if you'd like a copy
    return out


img1 = cv2.imread('pic3.png', 0) # Original image - ensure grayscale
img2 = cv2.imread('pic1.png', 0) # Rotated image - ensure grayscale

sift = cv2.SIFT()

# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

# Create matcher
bf = cv2.BFMatcher()

# Perform KNN matching
matches = bf.knnMatch(des1, des2, k=2)

# Apply ratio test
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
       # Add first matched keypoint to list
       # if ratio test passes
       good.append(m)

# Show only the top 10 matches - also save a copy for use later
out = drawMatches(img1, kp1, img2, kp2, good)
EN

回答 1

Stack Overflow用户

发布于 2017-11-16 11:19:57

根据你的要求,我假设你的意思是你有某种封闭的轮廓,勾勒出你想要将你的数据点对绑定到的区域。

这是相当简单的多边形等高线和更多的数学是需要更复杂的曲线,但解决办法是一样的。

你画一条从所讨论的点到无穷远的线。大多数人把一条线画成+x无穷大,但是任何方向都是可行的。如果有一个奇数的线交点,点在轮廓内。

参见本文:http://www.geeksforgeeks.org/how-to-check-if-a-given-point-lies-inside-a-polygon/

对于点对,只有两个点都在等高线内的对才完全在等高线内。对于具有凹面段的复杂轮廓形状,如果还想测试点之间的直线路径不与轮廓交叉,则对两个点之间的线段执行类似的测试,如果存在任何直线交叉点,则点之间在等高线之外交叉。

编辑:

因为你的轮廓是矩形,一个简单的方法就足以确定你的点是否在矩形内。

如果你的矩形是轴对齐的(它们是直的,不是旋转的),那么你可以用你的值来检查上、左、下、右。

让点A=顶,左,点B=下,右,点C=你的测试点。

我假设一个基于图像的坐标系,0,0是图像的左上方,宽度、高度是右下角。(我是用C#写的)

代码语言:javascript
运行
AI代码解释
复制
bool PointIsInside(Point A, Point B, Point C)
{
    if (A.X <= C.X && B.X >= C.X   &&   A.Y <= C.Y && B.Y >= C.Y)
        return true;
    return false;
}

如果矩形未对齐,则可以执行四次半空间测试,以确定您的点是否位于矩形内。

设点A=顶,左,点B=下,右,双W=宽,双H=高,双N=旋转角,C点=测试点。

对于轴对齐的矩形,可以通过取矢量(1,0),乘以宽度,并将该向量添加到顶部,向左,来计算上、右。对于底部,我们取向量(0,1),乘以高度,然后加到顶部,对。

(1, 0 )等于角0处的单位向量(长度为1)。同样,(0,1)是一个90度角的单位向量。这些矢量也可以被认为是直线指向的方向。这也意味着这些相同的向量可以用于从底部,左到下,右,从上,左到下,左以及左。

我们需要使用不同的单位向量,在提供的角度。为此,我们只需取给定角度的余弦和正弦。

设向量X=从上到上,从左到顶,从右到右,向量Y=从上到下,从右到右。

我在这个例子中用角度表示。

代码语言:javascript
运行
AI代码解释
复制
Vector X = new Vector();
Vector Y = new Vector();
X.X = Math.Cos(R);
X.Y = Math.Sin(R);
Y.X = Math.Cos(R+90);
Y.Y = Math.Sin(R+90);

因为我们从Top开始,左边,我们可以找到底部,右边,只需简单地将两个向量添加到Top,左侧

代码语言:javascript
运行
AI代码解释
复制
Point B = new Point();
B = A + X + Y;

我们现在想用点积来做半空间测试。前两个测试将使用测试点,顶部,左边,其他两个将使用测试点,以及底部,右边。

半空间测试本质上是基于方向性的。点是在前面,后面,还是垂直于给定的方向?我们有我们需要的两个方向,但它们是基于矩形的顶部,左点,而不是图像的全部空间,所以我们需要得到一个向量,从上,左,到所讨论的点,另一个从底部,右边,因为这是我们测试的两个点。

这是很简单的计算,因为它只是目的地-起源。

设向量D=顶部,左到测试点C,向量E=底部,右到测试点。

代码语言:javascript
运行
AI代码解释
复制
Vector D = C - A;
Vector E = C - B;

点积是两个向量的x1 * x2 + y1*y2。如果结果是正的,则这两个方向的绝对角度小于90度,或者大致是沿着相同的方向运动,零的结果表示它们是垂直的。在我们的例子中,它意味着测试点直接位于我们要测试的矩形的一侧。小于零意味着一个大于90度的绝对角度,或者它们大致是相反的方向。

如果点位于矩形内,则左上角的点积将为>= 0,而右下角的点积将为<= 0。从本质上说,测试点在从左上角进行测试时更接近右下角,但是当我们已经在右下角时,当我们选择相同的方向时,测试点就会离开,向上,向左。

代码语言:javascript
运行
AI代码解释
复制
double DotProd(Vector V1, Vector V2)
{
    return V1.X * V2.X + V1.Y * V2.Y;
}

所以我们的测试结果是:

代码语言:javascript
运行
AI代码解释
复制
if( DotProd(X, D) >= 0 && DotProd(Y, D) >= 0    &&    DotProd(X, E) <= 0 && DotProd(Y, E) <= 0)

然后点在矩形内。对这两个点执行此操作,如果两者都为真,则这条线位于矩形内。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47337200

复制
相关文章
vue中在父组件点击按钮触发子组件的事件
1、父组件的button元素绑定click事件,该事件指向notify方法 2、给子组件注册一个ref=“child” 3、父组件的notify的方法在处理时,使用了$refs.child把事件传递给子组件的parentMsg方法,同时携带着父组件中的参数msg 4、子组件接收到父组件的事件后,调用了parentMsg方法,把接收到的msg放到message数组中
江一铭
2022/06/16
6.5K0
vue.js 父组件如何触发子组件中的方法
组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以表现为用 is 特性进行了扩展的原生 HTML 元素。
IT工作者
2022/02/17
4.8K0
vue 父组件调用子组件的函数_vue子组件触发父组件方法
项目里将element-ui的el-upload写成公共组件方便调用,官方的before-upload方法用于处理上传前要做的事,如:比较文件大小,限制文件类型等,通过返回true 或 false 控制是否上传。 当该组件调用父组件方法,并且要能获取到父组件方法的返回值,如何实现?
全栈程序员站长
2022/11/10
3K0
vue子组件传值给父组件_子组件调用父组件中的方法
大家好,又见面了,我是你们的朋友全栈君。 参考视频 : https://www.bilibili.com/video/av32790541/?spm_id_from=trigger_reload 原
全栈程序员站长
2022/10/04
4.3K0
vue子组件传值给父组件_子组件调用父组件中的方法
Vuejs中父组件主动调用子组件的方法
我们都知道,vue是单向流,但是有时候我们需要在父组件中主动通知子组件一些信息,使其做出一些响应变化,那么如何在父组件中去主动调用子组件的方法呢?Vue当然给我们提供了方法,如下:
飞奔去旅行
2019/06/13
5.1K0
Vue父组件调用子组件事件
Vue父组件向子组件传递事件/调用事件 不是传递数据(props)哦,适用于 Vue 2.0 方法一:子组件监听父组件发送的方法 方法二:父组件调用子组件方法 子组件: export default { mounted: function () { this.$nextTick(function () { this.$on('childMethod', function () { console.log('监听成功') })
大鹅
2021/06/11
7490
Vue父组件与子组件传递事件/调用事件
如上:通过this.$emit()来触发父组件的方法。具体就是子组件触发$emit绑定的事件watchChild,然后父组件监听watchChild,一旦watchChild被触发便会触发父组件的parentReceive方法。
IT工作者
2022/02/17
3.5K0
输入框在输入中文时回车误触发输入的回车事件
这个问题出现在:chatx.me的输入框 最近反应的人比较多,然后还是问了下前前端同事,解决了。
SingYi
2023/08/23
3500
阻止中文输入时触发input事件
做限制输入框可输入最大的长度和实时匹配输入框数据时遇到了坑 —— 当中文输入时input事件也会被触发,即假设限制的是2个字符,你要输入社会人的“社(she)”,就会直接被截取,输入框填充文本sh。或者是在中文输入法时也会一直去调接口,匹配数据,影响了页面的性能!代码如下:
全栈程序员站长
2022/09/01
1.2K0
vue 父组件调用子组件的方法_vue子组件修改父组件值
我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法
全栈程序员站长
2022/11/09
2.1K0
React父组件调用子组件的方法
React组件化开发中子组件可以通过传递变量或者父组件的方法来实现和父组件的通信或者调用函数传值,但是父组件如何调用子组件的方法呢?很多介绍Hooks的文章并没有讲到useImperativeHandle,我以使用React18+TypeScript开发的项目为例,组件使用Hooks。以下是我精简过后的代码。
用户6256742
2022/07/06
5.8K0
Vue子组件调用父组件的方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
多凡
2019/11/01
2.2K0
子组件派发事件和值给父组件
父组件通过v-on绑定子组件派发的事件,并触发一个新的事件,新的事件内可以接收传来的值
小小杰啊
2022/12/21
3040
vue父组件引入子组件_vue子组件传递方法给父组件
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.1K0
vue父组件操作子组件的方法_vue父组件获取子组件数据
我们经常分不清什么是父组件,什么是子组件。现在来简单总结下:我们将某段代码封装成一个组件,而这个组件又在另一个组件中引入,而引入该封装的组件的文件叫做父组件,被引入的组件叫做子组件。具体代码如下
全栈程序员站长
2022/09/19
7.1K0
vue父组件操作子组件的方法_vue父组件获取子组件数据
vue父组件调用子组件方法
抱怨身处黑暗,不如提灯前行。——刘同 首先是官方文档 这里使用ref属性去访问子元素 <hello-world ref="helloWorld" msg="Hello World"></hello-world> 然后打印一下 console.log(this.$refs.helloWorld); 可以看到成功获取到 再到子组件定义一个方法: 父组件访问: 效果:
阿超
2022/08/17
1.8K0
vue父组件调用子组件方法
vue子组件调用父组件方法
强迫学习的东西是不会保存在心里的。——《柏拉图论教育》 首先我们在子组件中这样定义 <template> <div> <el-button @click="callSuper">123</el-button> </div> </template> <script> export default { methods: { callSuper() { this.$emit('parentEvent', '我的'); } } }; </script> 这里的组件就只有一个el-
阿超
2022/08/16
2.1K0
vue子组件调用父组件方法
input输入中文时,拼音触发input事件
在上一篇文章中写到了函数防抖,在使用函数防抖来进行搜索框优化的时候会遇到一个问题,就是监听文本输入框的input事件,在拼写汉字(输入法)但汉字并未实际填充到文本框中时会触发input事件,会出现下图的效果
OECOM
2020/07/01
8.3K1
vue父组件调用子组件方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
多凡
2019/11/01
2.6K0
vue父组件中获取子组件中的数据
<FormItem label="上传头像" prop="image"> <uploadImg :width="150" :height="150" :name="'avatar'" size="150px*150px" ref="avatar"></uploadImg> </FormItem> <FormItem label="上传营业执照" prop="businessLicence"> <uploadImg :width="350" :heigh
蓓蕾心晴
2018/04/12
7K0

相似问题

触发父组件父节点方法的子组件输出事件

38

监听VueJs中父组件触发的事件

110

如何从角2中的子组件事件触发父组件中的局部引用?

25

子组件中父组件的触发方法-- react

14

角键事件不会在子组件上触发,而只在父组件上触发。

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档