Labview+Python基于SIFT的特征点识别以及RANSAC的图像融合

您所在的位置:网站首页 Labview调用CAD Labview+Python基于SIFT的特征点识别以及RANSAC的图像融合

Labview+Python基于SIFT的特征点识别以及RANSAC的图像融合

#Labview+Python基于SIFT的特征点识别以及RANSAC的图像融合| 来源: 网络整理| 查看: 265

前言

一、Labview的图像视觉处理以及Labview的Python节点

二、基于Sift的特征点识别以及基于RANSAC的图像融合

1.基于Sift的特征点识别

总结  

前言

        Labview作为一种工控软件,能够通过图像化的语言实现对于测控仪器的控制。目前,笔者需要用到NI的PCI6259的板卡对于电源进行电压和电流的控制,同时需要用到图像处理的内,Labview自带的图像处理能够满足一些简单的应用但是不能满足笔者的要求,因此笔者需要通过外部的库进行图像处理操作,笔者之前的文章是直接利用Labview2020的python节点通过opencv调用摄像头,但是笔者希望通过python节点返回一些图像的信息,这就需要再python节点中的while循环里进行return这样会终止循环,并不能达到想要的效果。这里的python节点就像一个dll。

        因此,笔者尝试了另外一种思路,利用Labview 的视觉助手获取每一帧图像,之后对于将获得的图像转换成矩阵,利用python节点对于矩阵进行处理。

一、Labview的图像视觉处理以及Labview的Python节点

这是Labview的一个vi笔者采用的每200帧图像进行一次图像的拼接。

笔者仅用到Labview视觉助手的一个简单的图像获取的功能,然后将这个图像转换成二维的数组,使得该数组在python节点中进行一些图像的处理。

在这里需要注意的问题就是python节点在读取Labview图像矩阵的时候会存在一些问题

python节点直接读取Labview ImagToArray 的数据时会用读取一个一维数组这个时候会报错,说读取的不是ndarray(python节点与Labview数组的交互是通过ndarray进行的),而是一个scale,因此需要将一个数组转换成你所需要的高度和宽度

origin_image1 = np.array(Img1,dtype=np.uint8) origin_image2 = np.array(Img1,dtype=np.uint8) origin_image1 = origin_image1.reshape((1024,1280)) origin_image2 = origin_image2.reshape((1024,1280))

笔者这边摄像头读入的是8位图,是单通道图,后面要根据python调用的函数转换,通道数,可能需要将单通道图像转换成三通道图像也就是将8位图转换成24位图

这里给出一种方法,就是先扩展数组的维度然后按需求进行数组的拼接

originImg = np.expand_dims(originImg, axis=2) originImg = np.concatenate((originImg,originImg,originImg),axis=-1)

当RGB一样时就是所需的灰度图像

二、基于Sift的特征点识别以及基于RANSAC的图像融合 1.基于Sift的特征点识别

代码如下(示例):

sift = cv2.SIFT_create()     #获取各个图像的特征点返回     (kp1, des1) = sift.detectAndCompute(origin_image1, None)     (kp2, des2) = sift.detectAndCompute(origin_image2, None)     #特征点匹配     #K近邻算法求取空间距离最近的K个数据点,将数据点归为一类     bf = cv2.BFMatcher()#Brute-Force蛮力匹配BF匹配器使用cv2.BFMatcher()创建BFMetcher对象需要两个可选参数1,normtype指定要测量的距离,crossCheck     matches1 = bf.knnMatch(des1, des2, k=2)#BFMatcher.match()返回最佳匹配,knnMatch()返回k个最佳匹配     ratio1 = 0.01     good1 = []     for m1, n1 in matches1:         #如果最接近和此接近的比值大于一个既定的值,那么可以保留最接近的值,认为匹配的点为good_match         if m1.distance < ratio1 * n1.distance:             good1.append([m1])

2.基于RANSAC的图像融合

RANSAC的图像融合就是基于特征点匹配计算点的单应矩阵,在利用单应矩阵对于图像上的点进行投影,得到拼接的图像

if len(good1) > 4: ptsA = np.float32([kp1[m[0].queryIdx].pt for m in good1]).reshape(-1, 1, 2) ptsB = np.float32([kp2[m[0].trainIdx].pt for m in good1]).reshape(-1, 1, 2) ransacReprojThreshold = 4 # RANSAC算法选择其中最优的四个点 H, status = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, ransacReprojThreshold) imgout = cv2.warpPerspective(origin_image2, H, (origin_image1.shape[1]+origin_image2.shape[1], origin_image1.shape[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP) imgout[0:origin_image1.shape[0],0:origin_image1.shape[1]] = origin_image1 #后续的图像处理 img = cv2.medianBlur(imgout, 5) b = cv2.threshold(img, 15, 255, cv2.THRESH_BINARY) binary_image = b[1] #binary_image = cv2.cvtColor(binary_image, cv2.COLOR_BGR2GRAY) indexes = np.where(binary_image == 255) left = min(indexes[0]) right = max(indexes[0]) width = right - left bottom = min(indexes[1]) top = max(indexes[1]) height = top - bottom processed_picture = imgout[left:left + width, bottom:bottom + height]

第三张图时图像拼接之后的图图像的像素以及发生变换

总结

 Labview和python的联合编程感觉比较烦的就是出BUG之后的Debug的部分,Labview不能跳进Python节点中进行Debug,这样就是要Debug需要你自己写个差不多的Labview的输入输出图片格式之后利用Python的IDE进行Debug看是哪个数据结构的问题。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3