2012-10-25 14 views
15

मेरे पास 2 टेस्ट छवियां हैं। मेरा सवाल यह है कि छवि को फसल किए बिना दूसरी छवि में चतुर्भुज को पहली छवि में वर्ग को कैसे मैप करना है।ओपनसीवी वारप का उपयोग करते समय पूरी छवि को कैसे दिखाएं

छवि 1: image 1

छवि 2: image 2

यहाँ मेरे वर्तमान कोड openCV warpPerspective समारोह का उपयोग कर रहा है।

import cv2 
import numpy as np 

img1_square_corners = np.float32([[253,211], [563,211], [563,519],[253,519]]) 
img2_quad_corners = np.float32([[234,197], [520,169], [715,483], [81,472]]) 

h, mask = cv2.findHomography(img1_square_corners, img2_quad_corners) 
im = cv2.imread("image1.png") 
out = cv2.warpPerspective(im, h, (800,800)) 
cv2.imwrite("result.png", out) 

परिणाम: result

आप देख सकते हैं, क्योंकि dsize के = (800,800) warpPerspective समारोह में पैरामीटर, मैं नहीं छवि 1. का पूर्ण दृश्य अगर मैं dsize समायोजित प्राप्त कर सकते हैं, वर्ग ठीक से नक्शा नहीं करेगा। आउटपुट छवि का आकार बदलने का कोई तरीका है ताकि मैं छवि 1 की पूरी तस्वीर प्राप्त कर सकूं?

+0

आप विस्तार से बता सकता है ओ n "अगर मैं dsize समायोजित करता हूं, तो वर्ग ठीक से मैप नहीं करेगा"? क्या यह warped है? अनुवाद? बढ़ाया? ect। एक और छवि सहायक होगी – Hammer

उत्तर

8

हां, लेकिन आपको यह महसूस करना चाहिए कि आउटपुट छवि बहुत बड़ी हो सकती है। मैंने जल्दी से निम्नलिखित पायथन कोड लिखा, लेकिन 3000 x 3000 छवि भी आउटपुट फिट नहीं कर सका, यह परिवर्तन के कारण बहुत बड़ा तरीका है। हालांकि, मेरा कोड यहां है, मुझे उम्मीद है कि यह आपके लिए उपयोग करेगा।

import cv2 
import numpy as np 
import cv   #the old cv interface 

img1_square_corners = np.float32([[253,211], [563,211], [563,519],[253,519]]) 
img2_quad_corners = np.float32([[234,197], [520,169], [715,483], [81,472]]) 

h, mask = cv2.findHomography(img1_square_corners, img2_quad_corners) 
im = cv2.imread("image1.png") 

यहां एक आउटपुट छवि बनाएं, मैंने उदाहरण के रूप में (3000, 3000) का उपयोग किया था।

out_2 = cv.fromarray(np.zeros((3000,3000,3),np.uint8)) 

वर्ष cv इंटरफ़ेस का उपयोग करके, मैं उत्पादन करने के लिए सीधे लिखा था, और इसलिए इसके कट नहीं होती है। मैंने cv2 इंटरफ़ेस का उपयोग करके यह कोशिश की, लेकिन किसी कारण से यह काम नहीं किया ... शायद कोई उस पर कुछ प्रकाश डाल सकता है?

cv.WarpPerspective(cv.fromarray(im), out_2, cv.fromarray(h)) 
cv.ShowImage("test", out_2) 
cv.SaveImage("result.png", out_2) 
cv2.waitKey() 

वैसे भी, यह एक बहुत बड़ी छवि देता है, जिसमें आपकी मूल छवि 1 है, विकृत। यदि आप आउटपुट छवि को काफी बड़े होने के लिए निर्दिष्ट करते हैं तो पूरी छवि दिखाई देगी। (जो वास्तव में बहुत बड़ा हो सकता है!)

मुझे आशा है कि यह कोड आपकी मदद कर सकता है।

+0

सबसे पहले मैं होमोग्राफी में अनुवाद कारक जोड़ने जा रहा था, परिवर्तित छवि के विभिन्न क्षेत्रों के विचार प्राप्त कर रहा था और फिर विचारों को पूरी तरह से जोड़ सकता था। लेकिन आपका समाधान बेहतर लगता है! धन्यवाद! –

+0

कोई समस्या नहीं, मुझे खुशी है कि मेरे समाधान ने आपकी मदद की। – casper

28

मेरा समाधान परिणाम छवि आकार की गणना करना है, और फिर अनुवाद करना है।

def warpTwoImages(img1, img2, H): 
    '''warp img2 to img1 with homograph H''' 
    h1,w1 = img1.shape[:2] 
    h2,w2 = img2.shape[:2] 
    pts1 = float32([[0,0],[0,h1],[w1,h1],[w1,0]]).reshape(-1,1,2) 
    pts2 = float32([[0,0],[0,h2],[w2,h2],[w2,0]]).reshape(-1,1,2) 
    pts2_ = cv2.perspectiveTransform(pts2, H) 
    pts = concatenate((pts1, pts2_), axis=0) 
    [xmin, ymin] = int32(pts.min(axis=0).ravel() - 0.5) 
    [xmax, ymax] = int32(pts.max(axis=0).ravel() + 0.5) 
    t = [-xmin,-ymin] 
    Ht = array([[1,0,t[0]],[0,1,t[1]],[0,0,1]]) # translate 

    result = cv2.warpPerspective(img2, Ht.dot(H), (xmax-xmin, ymax-ymin)) 
    result[t[1]:h1+t[1],t[0]:w1+t[0]] = img1 
    return result 

dst_pts = float32([kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2) 
src_pts = float32([kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2) 
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) 

result = warpTwoImages(img1_color, img2_color, M) 

enter image description here

1

पहले, homography मैट्रिक्स गणना करने के लिए पहले समाधान का पालन करें। आपके पास होमोग्राफी मैट्रिक्स होने के बाद, आपको होमोग्राफी मैट्रिक्स के संबंध में छवि को वार करने की आवश्यकता है। आखिरकार, विकृत छवि मर्ज करें।

यहां, मैं एक और विचार साझा करूंगा जिसका उपयोग विकृत छवियों को मर्ज करने के लिए किया जा सकता है। (पहले का जवाब, ओवरले होने के लिए सूचकांक की एक श्रृंखला का उपयोग करता है, यहां मैं आरओआई का मास्किंग का उपयोग कर रहा हूं)

मास्क क्षेत्र का ब्याज (आरओआई) और काला के साथ छवि। फिर आरओआई के साथ छवि जोड़ें।(OpenCV Bitmask Tutorial देखें)

def copyOver(source, destination): 
    result_grey = cv2.cvtColor(source, cv2.COLOR_BGR2GRAY) 
    ret, mask = cv2.threshold(result_grey, 10, 255, cv2.THRESH_BINARY) 
    mask_inv = cv2.bitwise_not(mask) 
    roi = cv2.bitwise_and(source, source, mask=mask) 
    im2 = cv2.bitwise_and(destination, destination, mask=mask_inv) 
    result = cv2.add(im2, roi) 
    return result 


warpedImageB = cv2.warpPerspective(imageB, H, (imageA.shape[1], imageA.shape[0])) 
result = copyOver(imageA, warpedImageB) 

पहले छवि:

First

दूसरा छवि:

Second

सिले छवि: Stitched

संबंधित मुद्दे