栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python全景图像拼接及问题、库的安装等

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python全景图像拼接及问题、库的安装等

因为本人是python小白,刚看几天,所以很多都不懂,

以下本人学习python全景图像拼接时出现的一些问题,解决这些问题时在网上找了好久,浪费了大量时间,目前本人仅跑出了程序,还不理解各行代码的意义,所以仅仅是我在网上找到的东西进行简单的总结一下,希望对大家有一些帮助,如有错误请大家指出。

第一部分:全景图像拼接的问题

首先附上本人在网上找到的程序:

from imutils import paths
import numpy as np
import argparse
import imutils
import cv2

# 构造参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--images", type=str, required=True,
                help="path to input directory of images to stitch")
ap.add_argument("-o", "--output", type=str, required=True,
                help="path to the output image")
ap.add_argument("-c", "--crop", type=int, default=0,
                help="whether to crop out largest rectangular region")
args = vars(ap.parse_args())  # vars函数是实现返回对象object的属性和属性值的字典对象

print(args)  # {'images': 'images/scottsdale', 'output': 'output.png', 'crop': 1}
# 匹配输入图像的路径并初始化我们的图像列表
# rectangular_region = 2
print("[INFO] loading images...")
# 获取到每张待拼接图像并排序,如['第一张图片路径', 第二张图片路径',第三张图片路径']
imagePaths = sorted(list(paths.list_images(args["images"])))
# print(imagePaths)
# imagePaths = ['IMG_1786-2.jpg',
# 			  'IMG_1787-2.jpg',
# 			  'IMG_1788-2.jpg']
images = []

# 遍历图像路径,加载每个路径,然后将它们添加到我们的路径中图像到stich列表
for imagePath in imagePaths:
    image = cv2.imread(imagePath)
    images.append(image)

# 初始化OpenCV的图像sticher对象,然后执行图像拼接
print("[INFO] stitching images...")
stitcher = cv2.createStitcher() if imutils.is_cv3() else cv2.Stitcher_create()
(status, stitched) = stitcher.stitch(images)


# print(status, stitched)
# 如果状态为“0”,则OpenCV成功执行图像拼接
if status == 0:
    # 检查我们是否应该从拼接图像中裁剪出最大的矩形区域
    if args["crop"] > 0:
        # 在拼接图像周围创建一个10像素的黑色边框
        print("[INFO] cropping...")
        stitched = cv2.copyMakeBorder(stitched, 10, 10, 10, 10,
                                      cv2.BORDER_CONSTANT, (0, 0, 0))
        # cv2.imshow('123',stitched)

        # 将拼接图像转换为灰度
        gray = cv2.cvtColor(stitched, cv2.COLOR_BGR2GRAY)
        # cv2.imshow('456', gray)
        # 对灰度图像进行阈值二值化,
        # 这样所有大于零的像素都设置为255(前景),而其他所有像素都保持为0(背景)
        thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)[1]
        # cv2.imshow('789', thresh)
        # 在阈值图像中找到所有外部轮廓,然后找到 “最大 ”轮廓,它将是拼接图像的轮廓
        # cv2.RETR_EXTERNAL:只找外轮廓。cv2.CHAIN_APPROX_SIMPLE:输出少量轮廓点
        # 输出参数1:图像
        # 输出参数2:轮廓列表
        # 输出参数3:层级
        cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        # print(cnts) #cnts包括三个数组:
        # print(len(cnts))

        cnts = imutils.grab_contours(cnts)

        ################################
        # imutils.grab_contours 的源码 :

            # # if the length the contours tuple returned by cv2.findContours
            # # is '2' then we are using either OpenCV v2.4, v4-beta, or
            # # v4-official
            # if len(cnts) == 2:
            #     cnts = cnts[0]
            # # if the length of the contours tuple is '3' then we are using
            # # either OpenCV v3, v4-pre, or v4-alpha
            # elif len(cnts) == 3:
            #     cnts = cnts[1]
            # # otherwise OpenCV has changed their cv2.findContours return
            # # signature yet again and I have no idea WTH is going on
            # else:
            #     raise Exception(("Contours tuple must have length 2 or 3, "
            #                      "otherwise OpenCV changed their cv2.findContours return "
            #                      "signature yet again. Refer to OpenCV's documentation "
            #                      "in that case"))
            # # return the actual contours array
            # return cnts
        ##################################

        # 抓取具有最大区域的轮廓(即拼接图像本身的轮廓),cv2.contourArea是求轮廓面积
        c = max(cnts, key=cv2.contourArea)
        # print(c)
        # print(c.shape)
        # 为掩码分配内存,该掩码将包含拼接图像区域的矩形边界框
        mask = np.zeros(thresh.shape, dtype="uint8")
        # 计算出最大轮廓的边界框,使用边界矩形信息.使用 cv2.boundingRect(img) 函数,用一个最小的矩形,
        # 把找到的形状包起来,img是一个二值图,也就是它的参数;返回四个值,分别是 x,y,w,h;
        # 其中 x,y 是矩阵左上点的坐标,w,h 是矩阵的宽和高
        (x, y, w, h) = cv2.boundingRect(c)
        # 使用cv2.rectangle给图像加框,我们在mask上绘制一个纯白色矩形。
        # 参数1:图像
        # 参数2:左上角坐标
        # 参数3:右下角坐标
        # 参数4:框的颜色
        # 参数5:框的粗细
        cv2.rectangle(mask, (x, y), (x + w, y + h), 255, -1)

        # 创建掩码的两个副本
        # 第一个mask,将逐渐缩小,直到它可以放入全景内部。
        minRect = mask.copy()
        # 第二个mask,将用于确定是否需要继续减小minRect的大小。
        sub = mask.copy()
        cv2.imshow('111',sub)

        # 保持循环,直到sub中没有更多的前景像素
        # 对二值化图像执行countNonZero。可得到非零像素点数(即外边框的像素点)
        print(cv2.countNonZero(sub))
        while cv2.countNonZero(sub) > 0:
            # 执行侵蚀形态学操作以减小minRect的大小。
            minRect = cv2.erode(minRect, None)
            cv2.imshow('333',minRect)
            # 从minRect中减去thresh ,一旦minRect中没有更多的前景像素,我们就可以从循环中断开
            sub = cv2.subtract(minRect, thresh)

        # 在最小矩形掩码中找到轮廓,然后提取边界框(x,y) - 坐标
        cnts = cv2.findContours(minRect.copy(), cv2.RETR_EXTERNAL,
                                cv2.CHAIN_APPROX_SIMPLE)
        cv2.imshow('444', cnts[0])
        cnts = imutils.grab_contours(cnts)
        c = max(cnts, key=cv2.contourArea)
        (x, y, w, h) = cv2.boundingRect(c)

        # 使用边界框坐标来提取我们的最终拼接图像
        stitched = stitched[y:y + h, x:x + w]

        # 将输出拼接图像写入磁盘
        cv2.imwrite("result.jpg", stitched)

        # 将输出拼接图像显示到我们的屏幕
        cv2.imshow("Stitched", stitched)
        cv2.waitKey(0)

# 否则,拼接失败,可能是由于检测不到足够的关键点

else:
   print("[INFO] image stitching failed ({})".format(status))

使用方法:执行以下命令,在终端(cmd命令行)运行代码: python image_stitching.py --images images/scottsdale --output output.png --crop 1

待拼接图片:

 

 

拼接后:

 

 

问题一:

运行时可能会出现以下问题

python: can't open file 'h.py': [Errno 2] No such file or directory

解决:1、查看一下你的程序被你保存到了哪个地址,在cmd命令行中切换到该盘,再多次使用cd进入到该地址(注意空格),此时就可以正常运行程序了。例如保存到了D盘的DOWNLOAD中:

 2、如果上述操作之后还没有解决问题,请检查一下你的文件,文件夹的命名格式,其空格应用下划线 _  代替:或者图片的命名格式,例如一张图片命名为1.jpg,表面看起来并无错误,实际上电脑自动识别格式,其命名如下:

 

问题二:

 解决:

第一种方法:

 ①python切换环境到终端,运行代码python D:chengwei福工学习test1图像拼接_去除黑边image_stitching.py --images=images --output=output.png

②D:chengwei福工学习test1图像拼接_去除黑边image_stitching.py是指python文件所在的位置

③–images=images和–output=output.png是把“–images”,“–out”和images文件夹,output.png联系起来

运行正常结果如下:

 第二种方法:也可以在pycharm菜单栏中依次点击运行——编辑配置出现以下界面

在参数一栏输入-o/--output"./图像拼接_去除黑边"和-i/--images"./图像拼接_去除黑边",注意两者之间用空格隔开,若还要添加运行参数,可空格后继续填写。

-o/--output"./图像拼接_去除黑边"其中“-o/--output“是运行报错的原因,"./图像拼接_去除黑边"是为其添加的路径,对于-i/--images"./图像拼接_去除黑边"同理即可。

问题三:还可能会出现以下问题,但本人还未找到解决方法,只是把134行报错处删除了,此时程序也可以运行。

 问题四:还可能会出现以下失败的情况,目前还没有解决,于是本人换了其他的照片进行测试,结果成功拼接。

 

 第二部分:库的安装

当初本人在网上找了一些方法进行安装库,但忙活了一天还是安装失败,这还只是一个库,所幸最后找到了用pycharm安装的方法,分享给各位。

一种比较省事的安装方法就是先安装pycharm,再在python中安装库,如下图依次点击文件——设置——项目——python解释器,然后点击加号,搜索需要安装的包即可。

 以上解决方法都是源自网络,由于没有收藏,这里就只放上我还找得到的链接了。

python的numpy模块安装不成功——Python各种安装模块方法大全_MISAYAONE的博客-CSDN博客https://blog.csdn.net/misayaaaaa/article/details/53054665image-stitching-opencv: 对多张图片进行全景图像拼接,消除鬼影,消除裂缝 (gitee.com)https://gitee.com/hideinthehell/image-stitching-opencv如有侵权,联系删除。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/467820.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号