Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams
def stitch(self, images, ratio=0.75, reprojThresh=4.0,
    showMatches=False):
    (imageB, imageA) = images
    (kpsA, featuresA) = self.detectAndDescribe(imageA)
    (kpsB, featuresB) = self.detectAndDescribe(imageB)
    # match features between the two images
    M = self.matchKeypoints(kpsA, kpsB,
        featuresA, featuresB, ratio, reprojThresh)
    if M is None:
        return None
    # apply a perspective warp to stitch the images
    (matches, H, status) = M
    result = cv2.warpPerspective(imageA, H,
        (imageA.shape[1] + imageB.shape[1], imageA.shape[0]))
    result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB
    # check to see if the keypoint matches should be visualized
    if showMatches:
        vis = self.drawMatches(imageA, imageB, kpsA, kpsB, matches,
            status)
        # return a tuple of the stitched image and the
        # visualization
        return (result, vis)
    # return the stitched image
    return result
def detectAndDescribe(self, image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    if self.isv3:
        orb = cv2.ORB_create()
        (kps, features) = orb.detectAndCompute(image, None)
    # If we are using OpenCV 2.4.X
    else:
        # detect keypoints in the image
        detector = cv2.FeatureDetector_create("ORB")
        kps = detector.detect(gray)
        # extract features from the image
        extractor = cv2.DescriptorExtractor_create("ORB")
        (kps, features) = extractor.compute(gray, kps)
    # convert the keypoints to NumPy arrays
    kps = np.float32([kp.pt for kp in kps])
    # return a tuple of keypoints and features
    return (kps, features)
def matchKeypoints(self, kpsA, kpsB, featuresA, featuresB,
    ratio, reprojThresh):
    # compute the raw matches and initialize the list of actual matches
    matcher = cv2.DescriptorMatcher_create("BruteForce")
    rawMatches = matcher.knnMatch(featuresA, featuresB, 2)
    matches = []
    # loop over the raw matches
    for m in rawMatches:
        # ensure the distance is within a certain ratio of each
        # other (i.e. Lowe's ratio test)
        if len(m) == 2 and m[0].distance < m[1].distance * ratio:
            matches.append((m[0].trainIdx, m[0].queryIdx))
    # computing a homography requires at least 4 matches
    if len(matches) > 4:
        # construct the two sets of points
        ptsA = np.float32([kpsA[i] for (_, i) in matches])
        ptsB = np.float32([kpsB[i] for (i, _) in matches])
        # homography between the two sets of points
        (H, status) = cv2.findHomography(ptsA, ptsB, cv2.RANSAC,
            reprojThresh)
        # return the matches along with the homograpy matrix
        # and status of each matched point
        return (matches, H, status)
    return None
def drawMatches(self, imageA, imageB, kpsA, kpsB, matches, status):
    # initialize the output visualization image
    (hA, wA) = imageA.shape[:2]
    (hB, wB) = imageB.shape[:2]
    vis = np.zeros((max(hA, hB), wA + wB, 3), dtype="uint8")
    vis[0:hA, 0:wA] = imageA
    vis[0:hB, wA:] = imageB
    # loop over the matches
    for ((trainIdx, queryIdx), s) in zip(matches, status):
        # matching if the keypoint is matched
        if s == 1:
            # draw the match
            ptA = (int(kpsA[queryIdx][0]), int(kpsA[queryIdx][1]))
            ptB = (int(kpsB[trainIdx][0]) + wA, int(kpsB[trainIdx][1]))
            cv2.line(vis, ptA, ptB, (240, 255, 100), 1)
    # return the visualization
    return vis
Output:: Attribute Error: 'module' object has no attribute 'is_cv3

Please check the code and resend the edited code to solve the problem.

is imutils a package you are installing from pypi or your own utils? assuming it's your own utils @roganjosh comment makes sense... – Pippo Feb 8, 2017 at 15:29 Most likely it's the one mentioned here pyimagesearch.com/2015/08/10/… , although it's entirely possibly he either is shadowing it, or is using an older version that doesn't have is_cv3 ... you may want to do import imutils; print(dir(imutils)) to see what it has – Foon Feb 8, 2017 at 15:31 Ugh... Sayantan: your edit just made things worse; A) the formatting just got messed up and B) you went from a farily minimal example to something with extraneous code. I suggest reverting, and also including the output of pip freeze (which will show what version of imutils you are using) – Foon Feb 8, 2017 at 15:33 "Please check the code and resend the edited code to solve the problem." No. What makes you think we should do that? Also, it would be helpful if you could read and respond to comments that have been here for 20 minutes that might already fix your problem. Please take some time to read How to ask. – roganjosh Feb 8, 2017 at 15:33

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.