PCV库之调用SIFT.py中process_image()执行错误的解决方案

83 阅读4分钟

背景介绍:

windows10,python3.x,64位AMD R9处理器,ROG电脑,pycharm开发,已经安装好了PCV库

如何安装PCV库 请看我的博客Python之PCV库安装教程以及解说-CSDN博客文章浏览阅读111次,点赞5次,收藏3次。GitHub - Ultravioletrayss/PCVfile: 文档内含有python2 和python3的文件 一定要区分下载 Files containing Python 2 and Python 3 in the document must be downloaded separately。这样就是安装成功了 但是有些同学可能python setup.py install后没有任何反应 就像下面这张图一样(因为我一开始就是)下载的时候请对应好版本进行下载,具体内容我已经上传github中。https://blog.csdn.net/Ultravioletrays/article/details/138196025?spm=1001.2014.3001.5501

前置import代码如下 涉及到的库有:

# coding: utf-8
import math
import pickle
import sys
from matplotlib.pylab import *
from matplotlib import cbook, mlab, pyplot as plt
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import pygame, pygame.image
from pygame.locals import *
from PCV.geometry import homography, camera
from PCV.localdescriptors import sift
import matplotlib

在使用PCV库的SIFT文件时候,有这样几行代码一直报错,就是process_image这个函数

​编辑

具体报错:

​编辑

Traceback (most recent call last):
File "C:\Users\ultra\Desktop\壶子.py", line 133, in
l0, d0 = sift.read_features_from_file('im0.sift')
File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\pcv-1.0-py3.9.egg\PCV\localdescriptors\sift.py", line 29, in read_features_from_file
File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\lib\npyio.py", line 1373, in loadtxt
arr = _read(fname, dtype=dtype, comment=comment, delimiter=delimiter,
File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\lib\npyio.py", line 992, in _read
fh = np.lib._datasource.open(fname, 'rt', encoding=encoding)
File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\lib_datasource.py", line 193, in open
return ds.open(path, mode, encoding=encoding, newline=newline)
File "C:\Users\ultra\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\lib_datasource.py", line 533, in open
raise FileNotFoundError(f"{path} not found.")
FileNotFoundError: im0.sift not found.

大概就是说​编辑

这个文件没有生成出来,一看我的项目结构 确实没有​编辑

于是定位问题到sift.process_image这个函数中.​编辑

def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"):
    """ Process an image and save the results in a file. """

    if imagename[-3:] != 'pgm':
        # create a pgm file
        im = Image.open(imagename).convert('L')
        im.save('tmp.pgm')
        imagename = 'tmp.pgm'

    cmmd = str("sift "+imagename+" --output="+resultname+
                " "+params)
    status=os.system(cmmd)
    if status != 0:
        print("命令执行失败,状态码:", status)
    else:
        print("命令执行成功")
    print('processed', imagename, 'to', resultname)

 上面就是核心代码,我对这段代码进行了修改 原始的代码如下图所示

def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"):
    """ Process an image and save the results in a file. """

    if imagename[-3:] != 'pgm':
        # create a pgm file
        im = Image.open(imagename).convert('L')
        im.save('tmp.pgm')
        imagename = 'tmp.pgm'

    cmmd = str("sift "+imagename+" --output="+resultname+
                " "+params)
    os.system(cmmd)
    print('processed', imagename, 'to', resultname)

我增加了对于os.system语句的判定检查,从而定位到了错误就是这里. 

    cmmd = str("sift "+imagename+" --output="+resultname+
                " "+params)
    status=os.system(cmmd)

这两个语句发生了问题 os.system没有执行成功.

于是我在网上开始查找资料 找了半天 找到了一个

[SIFT特征提取与检索_"cmmd = str(“sift " + imagename + " --output=” +-CSDN博客文章浏览阅读400次。1.前言所谓局部特征描述算子(SIFT)就是用来刻画图像中的这些局部共性的,而我们也可以将一幅图像映射(变换)为一个局部特征的集合。理想的局部特征应具有平移、缩放、旋转不变性,同时对光照变化、仿射及投影影响也应有很好的鲁棒性。传统的局部特征往往是直接提取角点或边缘,对环境的适应能力较差。SIFT针对局部特征进行特征提取,在尺度空间寻找极值点,提取位置,尺度,旋转不变量,生成特征描述子。SI..."cmmd = str(“sift " + imagename + " --output=” + resultname + " " + params)"blog.csdn.net/qq_41634240…blog.csdn.net/qq_41634240… "SIFT特征提取与检索"cmmd = str(“sift " + imagename + " --output=” +-CSDN博客")简单来说就是要往你的项目里面导入几个文件即可

原因是:需要使用开源工具包VLFeat提供的二进制文件来计算图像的SIFT特征

                                                    打开下面网址进行下载VLFeat - Homehttps://www.vlfeat.org/

 页面如下:

​编辑

下载完毕后 解压 或者直接打开压缩包 找到bin文件目录

​编辑

注意系统版本我们一般都是win64 不用打开其他的maci或者glnxa64.

然后我们只需要三个文件vl.dll和sift.exe和vl.lib 复制到我们的项目文件里面去 如下图所示

​编辑

然后就能运行了!