Labview+Python基于SIFT的特征点识别以及RANSAC的图像融合 |
您所在的位置:网站首页 › Labview调用CAD › Labview+Python基于SIFT的特征点识别以及RANSAC的图像融合 |
前言 一、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 |