mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 23:33:05 +04:00
Merge branch 4.x
This commit is contained in:
@@ -20,10 +20,10 @@ scale invariant.
|
||||
|
||||

|
||||
|
||||
So, in 2004, **D.Lowe**, University of British Columbia, came up with a new algorithm, Scale
|
||||
In 2004, **D.Lowe**, University of British Columbia, came up with a new algorithm, Scale
|
||||
Invariant Feature Transform (SIFT) in his paper, **Distinctive Image Features from Scale-Invariant
|
||||
Keypoints**, which extract keypoints and compute its descriptors. *(This paper is easy to understand
|
||||
and considered to be best material available on SIFT. So this explanation is just a short summary of
|
||||
and considered to be best material available on SIFT. This explanation is just a short summary of
|
||||
this paper)*.
|
||||
|
||||
There are mainly four steps involved in SIFT algorithm. We will see them one-by-one.
|
||||
@@ -102,16 +102,17 @@ reasons. In that case, ratio of closest-distance to second-closest distance is t
|
||||
greater than 0.8, they are rejected. It eliminates around 90% of false matches while discards only
|
||||
5% correct matches, as per the paper.
|
||||
|
||||
So this is a summary of SIFT algorithm. For more details and understanding, reading the original
|
||||
paper is highly recommended. Remember one thing, this algorithm is patented. So this algorithm is
|
||||
included in [the opencv contrib repo](https://github.com/opencv/opencv_contrib)
|
||||
This is a summary of SIFT algorithm. For more details and understanding, reading the original
|
||||
paper is highly recommended.
|
||||
|
||||
SIFT in OpenCV
|
||||
--------------
|
||||
|
||||
So now let's see SIFT functionalities available in OpenCV. Let's start with keypoint detection and
|
||||
draw them. First we have to construct a SIFT object. We can pass different parameters to it which
|
||||
are optional and they are well explained in docs.
|
||||
Now let's see SIFT functionalities available in OpenCV. Note that these were previously only
|
||||
available in [the opencv contrib repo](https://github.com/opencv/opencv_contrib), but the patent
|
||||
expired in the year 2020. So they are now included in the main repo. Let's start with keypoint
|
||||
detection and draw them. First we have to construct a SIFT object. We can pass different
|
||||
parameters to it which are optional and they are well explained in docs.
|
||||
@code{.py}
|
||||
import numpy as np
|
||||
import cv2 as cv
|
||||
|
||||
@@ -88,27 +88,27 @@ B = cv.imread('orange.jpg')
|
||||
# generate Gaussian pyramid for A
|
||||
G = A.copy()
|
||||
gpA = [G]
|
||||
for i in xrange(6):
|
||||
for i in range(6):
|
||||
G = cv.pyrDown(G)
|
||||
gpA.append(G)
|
||||
|
||||
# generate Gaussian pyramid for B
|
||||
G = B.copy()
|
||||
gpB = [G]
|
||||
for i in xrange(6):
|
||||
for i in range(6):
|
||||
G = cv.pyrDown(G)
|
||||
gpB.append(G)
|
||||
|
||||
# generate Laplacian Pyramid for A
|
||||
lpA = [gpA[5]]
|
||||
for i in xrange(5,0,-1):
|
||||
for i in range(5,0,-1):
|
||||
GE = cv.pyrUp(gpA[i])
|
||||
L = cv.subtract(gpA[i-1],GE)
|
||||
lpA.append(L)
|
||||
|
||||
# generate Laplacian Pyramid for B
|
||||
lpB = [gpB[5]]
|
||||
for i in xrange(5,0,-1):
|
||||
for i in range(5,0,-1):
|
||||
GE = cv.pyrUp(gpB[i])
|
||||
L = cv.subtract(gpB[i-1],GE)
|
||||
lpB.append(L)
|
||||
@@ -122,7 +122,7 @@ for la,lb in zip(lpA,lpB):
|
||||
|
||||
# now reconstruct
|
||||
ls_ = LS[0]
|
||||
for i in xrange(1,6):
|
||||
for i in range(1,6):
|
||||
ls_ = cv.pyrUp(ls_)
|
||||
ls_ = cv.add(ls_, LS[i])
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
|
||||
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
|
||||
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
|
||||
|
||||
for i in xrange(6):
|
||||
for i in range(6):
|
||||
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray',vmin=0,vmax=255)
|
||||
plt.title(titles[i])
|
||||
plt.xticks([]),plt.yticks([])
|
||||
@@ -98,7 +98,7 @@ titles = ['Original Image', 'Global Thresholding (v = 127)',
|
||||
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
|
||||
images = [img, th1, th2, th3]
|
||||
|
||||
for i in xrange(4):
|
||||
for i in range(4):
|
||||
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
|
||||
plt.title(titles[i])
|
||||
plt.xticks([]),plt.yticks([])
|
||||
@@ -153,7 +153,7 @@ titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
|
||||
'Original Noisy Image','Histogram',"Otsu's Thresholding",
|
||||
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
|
||||
|
||||
for i in xrange(3):
|
||||
for i in range(3):
|
||||
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
|
||||
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
|
||||
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
|
||||
@@ -196,7 +196,7 @@ bins = np.arange(256)
|
||||
fn_min = np.inf
|
||||
thresh = -1
|
||||
|
||||
for i in xrange(1,256):
|
||||
for i in range(1,256):
|
||||
p1,p2 = np.hsplit(hist_norm,[i]) # probabilities
|
||||
q1,q2 = Q[i],Q[255]-Q[i] # cum sum of classes
|
||||
if q1 < 1.e-6 or q2 < 1.e-6:
|
||||
|
||||
+1
-1
@@ -268,7 +268,7 @@ fft_filters = [np.fft.fft2(x) for x in filters]
|
||||
fft_shift = [np.fft.fftshift(y) for y in fft_filters]
|
||||
mag_spectrum = [np.log(np.abs(z)+1) for z in fft_shift]
|
||||
|
||||
for i in xrange(6):
|
||||
for i in range(6):
|
||||
plt.subplot(2,3,i+1),plt.imshow(mag_spectrum[i],cmap = 'gray')
|
||||
plt.title(filter_name[i]), plt.xticks([]), plt.yticks([])
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ from matplotlib import pyplot as plt
|
||||
cap = cv.VideoCapture('vtest.avi')
|
||||
|
||||
# create a list of first 5 frames
|
||||
img = [cap.read()[1] for i in xrange(5)]
|
||||
img = [cap.read()[1] for i in range(5)]
|
||||
|
||||
# convert all to grayscale
|
||||
gray = [cv.cvtColor(i, cv.COLOR_BGR2GRAY) for i in img]
|
||||
|
||||
@@ -83,4 +83,4 @@ Additional Resources
|
||||
2. [NumPy Quickstart tutorial](https://numpy.org/devdocs/user/quickstart.html)
|
||||
3. [NumPy Reference](https://numpy.org/devdocs/reference/index.html#reference)
|
||||
4. [OpenCV Documentation](http://docs.opencv.org/)
|
||||
5. [OpenCV Forum](http://answers.opencv.org/questions/)
|
||||
5. [OpenCV Forum](https://forum.opencv.org/)
|
||||
|
||||
@@ -22,10 +22,10 @@ Installing OpenCV-Python from Pre-built Binaries
|
||||
|
||||
This method serves best when using just for programming and developing OpenCV applications.
|
||||
|
||||
Install package [python-opencv](https://packages.ubuntu.com/trusty/python-opencv) with following command in terminal (as root user).
|
||||
Install package [python3-opencv](https://packages.ubuntu.com/focal/python3-opencv) with following command in terminal (as root user).
|
||||
|
||||
```
|
||||
$ sudo apt-get install python-opencv
|
||||
$ sudo apt-get install python3-opencv
|
||||
```
|
||||
|
||||
Open Python IDLE (or IPython) and type following codes in Python terminal.
|
||||
|
||||
Reference in New Issue
Block a user