日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

getprocaddress得到为0_拼接图像得到全景图

發布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 getprocaddress得到为0_拼接图像得到全景图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:

  • 函數介紹
  • 圖像拼接算法實現
  • 圖像拼接算法改進
  • Image Stitching with OpenCV and Python - PyImageSearch?www.pyimagesearch.com

    本文參考上面這個鏈接,實現多張圖像的拼接,構建一張全景圖。

    根據多個圖像創建全景圖的步驟為:

  • 檢測兩張圖像的關鍵點特征(DoG、Harris等)
  • 計算不變特征描述符(SIFT、SURF或ORB等)
  • 根據關鍵點特征和描述符,對兩張圖像進行匹配,得到若干匹配點對,并移除錯誤匹配;
  • 使用Ransac算法和匹配的特征來估計單應矩陣(homography matrix);
  • 通過單應矩陣來對圖像進行仿射變換;
  • 兩圖像拼接,重疊部分融合;
  • 裁剪以獲得美觀的最終圖像。
  • 原理比較復雜,本文先不講解,OpenCV中已經實現了全景圖拼接的算法,它們是 cv2.createStitcher (OpenCV 3.x) 和 cv2.Stitcher_create(OpenCV 4) 。

    該算法對以下條件具有較好的魯棒性:

    • 輸入圖像的順序
    • 圖像的方向
    • 光照變化
    • 圖像噪聲

    一、函數介紹

    OpenCV 3.x 的 cv2.createStitcher 函數原型為:

    createStitcher(...)createStitcher([, try_use_gpu]) -> retval

    這個函數有一個參數 try_use_gpu,它可以用來提升圖像拼接整個過程的速度。

    OpenCV 4 的 cv2.Stitcher_create 函數原型為:

    Stitcher_create(...)Stitcher_create([, mode]) -> retval. @brief Creates a Stitcher configured in one of the stitching. modes.. . @param mode Scenario for stitcher operation. This is usually. determined by source of images to stitch and their transformation.. Default parameters will be chosen for operation in given scenario.. @return Stitcher class instance.

    要執行實際的圖像拼接,我們需要調用 .stitch 方法:

    OpenCV 3.x: stitch(...) method of cv2.Stitcher instancestitch(images[, pano]) -> retval, panoOpenCV 4.x: stitch(...) method of cv2.Stitcher instancestitch(images, masks[, pano]) -> retval, pano. @brief These functions try to stitch the given images.. . @param images Input images.. @param masks Masks for each input image specifying where to. look for keypoints (optional).. @param pano Final pano.. @return Status code.

    該方法接收一個圖像列表,然后嘗試將它們拼接成全景圖像,并進行返回。

    變量 status=0表示圖像拼接是否成功。

    二、圖像拼接算法實現

    先把三張圖片讀取出來存放到列表里:

    img_dir = 'pictures/stitching' names = os.listdir(img_dir)images = [] for name in names:img_path = os.path.join(img_dir, name)image = cv2.imread(img_path)images.append(image)

    圖片順序沒有影響,我試了一下,不同的圖片順序,輸出全景圖都相同。

    然后構造圖像拼接對象stitcher, 要注意的是,OpenCV 3 和 4 的構造器是不同的。

    import imutils stitcher = cv2.createStitcher() if imutils.is_cv3() else cv2.Stitcher_create()

    再把圖像列表傳入.stitch函數,該函數會返回狀態和拼接好的全景圖(如果沒有錯誤):

    status, stitched = stitcher.stitch(images)

    完整代碼如下:

    import os import cv2 import imutilsimg_dir = 'pictures/stitching' names = os.listdir(img_dir)images = [] for name in names:img_path = os.path.join(img_dir, name)image = cv2.imread(img_path)images.append(image)stitcher = cv2.createStitcher() if imutils.is_cv3() else cv2.Stitcher_create() status, stitched = stitcher.stitch(images)if status==0:cv2.imwrite('pictures/stitch.jpg', stitched)

    OpenCV真的很強大,這短短幾行,就實現了拼接全景圖。

    全景圖如下:

    呃,全景圖是實現了,但是周圍出現了一些黑色區域。

    這是因為構建全景時會做透視變換,透視變換時會產生這些黑色區域。

    所以需要做進一步處理,裁剪出全景圖的最大內部矩形區域,也就是只保留下圖中紅色虛線邊框內的全景區域。

    三、圖像拼接算法改進

    獲取圖像列表并得到初步全景圖,這兩步還是相同的:

    img_dir = 'pictures/stitching' names = os.listdir(img_dir)images = [] for name in names:img_path = os.path.join(img_dir, name)image = cv2.imread(img_path)images.append(image)stitcher = cv2.createStitcher() if imutils.is_cv3() else cv2.Stitcher_create() status, stitched = stitcher.stitch(images)

    在全景圖四周各添加10像素寬的黑色邊框,以確保能夠找到全景圖的完整輪廓:

    stitched = cv2.copyMakeBorder(stitched, 10, 10, 10, 10, cv2.BORDER_CONSTANT, (0, 0, 0))

    再將全景圖轉換為灰度圖,并將不為0的像素全置為255,作為前景,其他像素灰度值為0,作為背景。

    gray = cv2.cvtColor(stitched, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)

    現在有了全景圖的二值圖,再應用輪廓檢測,找到最大輪廓的邊界框,

    注:和輪廓相關的詳細講解可以查看 這篇文章。

    cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt = max(cnts, key=cv2.contourArea) # 獲取最大輪廓mask = np.zeros(thresh.shape, dtype="uint8") x, y, w, h = cv2.boundingRect(cnt) # 繪制最大外接矩形框(內部填充) cv2.rectangle(mask, (x, y), (x + w, y + h), 255, -1)

    這個白色矩形框是整個全景圖可以容納下的最小矩形區域。

    接下來就是最難,也是最巧妙的部分了,先創建mask的兩個副本:

    • minRect,這個mask的白色區域會慢慢縮小,直到它剛好可以完全放入全景圖內部。
    • sub,這個mask用于確定minRect是否需要繼續減小,以得到滿足要求的矩形區域。
    minRect = mask.copy() sub = mask.copy()# 開始while循環,直到sub中不再有前景像素 while cv2.countNonZero(sub) > 0:minRect = cv2.erode(minRect, None)sub = cv2.subtract(minRect, thresh)

    不斷地對minRect進行腐蝕操作,然后用minRect減去之前得到的閾值圖像,得到sub,

    再判斷sub中是否存在非零像素,如果不存在,則此時的minRect就是我們最終想要的全景圖內部最大矩形區域。

    sub和minRect在while循環中的變化情況如下動圖所示:

    因為OpenCV中灰度圖像素值范圍0-255,如果兩個數相減得到負數的話,會直接將其置為0;如果兩個數相加,結果超過了255的話,則直接置為255。

    比如下面這個圖,左圖中白色矩形可以完全包含在全景圖中,但不是全景圖的最大內接矩形,用它減去右邊的閾值圖,

    因為黑色像素減白色像素,會得到黑色像素,所以其結果圖為全黑的圖。

    所以上面那個while循環最終得到的minRect就是減去閾值圖得到全黑圖的面積最大的矩形區域。

    好了,我們已經得到全景圖的內置最大矩形框了,接下來就是找到這個矩形框的輪廓,并獲取其坐標:

    cnts, hierarchy = cv2.findContours(minRect.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt = max(cnts, key=cv2.contourArea) # 計算最大輪廓的邊界框 (x, y, w, h) = cv2.boundingRect(cnt)# 使用邊界框坐標提取最終的全景圖 stitched = stitched[y:y + h, x:x + w]

    得到最終結果圖如下:

    完整代碼如下:

    import os import cv2 import imutils import numpy as npimg_dir = '/images' names = os.listdir(img_dir)images = [] for name in names:img_path = os.path.join(img_dir, name)image = cv2.imread(img_path)images.append(image)stitcher = cv2.createStitcher() if imutils.is_cv3() else cv2.Stitcher_create() status, stitched = stitcher.stitch(images)# 四周填充黑色像素,再得到閾值圖 stitched = cv2.copyMakeBorder(stitched, 10, 10, 10, 10, cv2.BORDER_CONSTANT, (0, 0, 0)) gray = cv2.cvtColor(stitched, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt = max(cnts, key=cv2.contourArea)mask = np.zeros(thresh.shape, dtype="uint8") x, y, w, h = cv2.boundingRect(cnt) cv2.rectangle(mask, (x, y), (x + w, y + h), 255, -1)minRect = mask.copy() sub = mask.copy()# 開始while循環,直到sub中不再有前景像素 while cv2.countNonZero(sub) > 0:minRect = cv2.erode(minRect, None)sub = cv2.subtract(minRect, thresh)cnts, hierarchy = cv2.findContours(minRect.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnt = max(cnts, key=cv2.contourArea) x, y, w, h = cv2.boundingRect(cnt)# 使用邊界框坐標提取最終的全景圖 stitched = stitched[y:y + h, x:x + w]cv2.imwrite('final.jpg', stitched)

    如果覺得有用,就點個贊吧(? ??_??)?。

    總結

    以上是生活随笔為你收集整理的getprocaddress得到为0_拼接图像得到全景图的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产盗摄av | 日本成人三级电影 | 韩国日本在线 | 亚洲污污视频 | av最新资源 | 亚洲欧美一| 国产精品久久久久久久久免费看 | 人妻大战黑人白浆狂泄 | 久久99精品久久久久久国产越南 | 被警察猛c猛男男男 | 国产精品日韩专区 | 丁香激情综合 | 精品国产伦一区二区三区 | 男人爆操女人 | 国产亚洲精品一区二区三区 | 中文高清av | 日本xxxxxⅹxxxx69 | 一级黄色免费大片 | 国产午夜精品免费一区二区三区视频 | 国产999在线观看 | 欧美另类一区 | 调教在线观看 | 欧美一区二区在线观看视频 | 天天操天天干天天爱 | av在线不卡播放 | 日韩电影在线观看一区二区 | 草草影院1 | 国产丝袜一区二区 | 秋霞影院午夜老牛影院 | 无码aⅴ精品一区二区三区 精品久久在线 | 首尔之春在线观看 | 欧美色图88 | a毛片在线免费观看 | mdyd—856冲田杏梨在线 | 国产97在线 | 亚洲 | 永久免费的av网站 | 国产精品久久久 | gogo人体做爰aaaa | 四虎影院永久地址 | 美女张开双腿让男人捅 | 欧美精品自拍 | 美女一区二区三区 | 澳门黄色一级片 | 三极片黄色 | 男女www| 给我看免费高清在线观看 | 成人污网站 | 久久久情| 被扒开腿一边憋尿一边惩罚 | www.中文字幕.com | 高清不卡一区二区 | 黄色成人在线视频 | 一级色视频 | 在线观看视频一区 | 亚洲AV无码片久久精品 | se日韩 | 亚洲AV不卡无码一区二区三区 | 99久久婷婷国产一区二区三区 | 激情福利在线 | 欧美aaaaaaa | 国产另类精品 | 中国黄色一级大片 | 欧洲成人综合网 | 九七在线视频 | 最近日韩中文字幕 | 日韩视频免费观看高清完整版 | 欧美九九九 | 久久久久无码国产精品一区 | 国产成人97精品免费看片 | 中文字幕在线视频播放 | 无码人妻精品一区二区三应用大全 | 欧美区一区二区三 | 欧美伊人网 | 一级裸体片 | 久视频在线 | 一区二区三区在线视频观看 | 欧美一区二区三区成人久久片 | 亚洲国产成人va在线观看天堂 | 91色精品| 精品一卡二卡 | 日本三级一区二区 | 人成精品 | 精品综合 | 午夜8888| 精品一区二区免费看 | 97综合视频 | 午夜精品一区二区三区免费视频 | 好吊妞在线| 中文字幕无码乱码人妻日韩精品 | 一出一进一爽一粗一大视频 | 奶波霸巨乳一二三区乳 | 国产伦精品一区二区三区视频网站 | 在线你懂得 | 亚洲三级伦理 | 美国一级大黄一片免费中文 | 国产一二三在线观看 | 芒果视频在线观看免费 | 67194av| 亚洲免费av一区二区 |