在opencv裡,有時候使用不對的資料型別,比如cv.cv_8u或np.uint8時,可能會出錯的,下面就來舉乙個例子,如下:
#python 3.7.4,opencv4.1
#蔡軍生
#import numpy as np
import cv2
from matplotlib import pyplot as plt
plt.rcparams['font.sans-serif']=['simhei'] #用來正常顯示中文標籤
plt.rcparams['axes.unicode_minus']=false #用來正常顯示負號
#讀取檔案
img = cv2.imread('box1.png',0)
#輸出的資料型別dtype = cv.cv_8u
sobelx8u = cv2.sobel(img,cv2.cv_8u,1,0,ksize=5)
#輸出的資料型別dtype = cv.cv_64f,然後取絕對值absolute,再轉換為cv.cv_8u
sobelx64f = cv2.sobel(img,cv2.cv_64f,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('原圖'), plt.xticks(), plt.yticks()
plt.subplot(1,3,2),plt.imshow(sobelx8u,cmap = 'gray')
plt.title('sobel cv_8u型別'), plt.xticks(), plt.yticks()
plt.subplot(1,3,3),plt.imshow(sobel_8u,cmap = 'gray')
plt.title('sobel abs(cv_64f)型別'), plt.xticks(), plt.yticks()
plt.show()
#cv2.waitkey(0)
cv2.destroyallwindows()
結果輸出如下:
從上圖的原圖裡可以看到,垂直方向的邊緣有兩條,左邊一條右邊一條,如果只是使用cv.cv_8u型別時,發現右邊那一條邊緣不見了,為什麼會這樣呢?其實原因是這要,當從黑到白時,檢測出來邊緣是正值,轉換為cv.cv_8u型別正常;但是從白到黑時,檢測出來邊緣是負值,這時轉換為cv.cv_8u型別時,就強制轉換為0,因此就少了右邊的邊緣。所以對於cv.sobel()的函式計算時,要小心地使用合適的資料型別,否則會得不到正確的結果。最後乙個圖是因為採用了64位浮點數型別,並且求了絕對值,然後再做8位無符號的轉換,這樣結果就正常顯示出來了。因此,一般操作是使用cv.cv_16s, cv.cv_64f型別,然後取絕對值np.absolute,最後才轉換為cv.cv_8u型別。
OpenCV的資料型別
一般的影象檔案格式使用的是 unsigned 8bits。cvmat矩陣對應的引數型別就是cv 8uc1,cv 8uc2,cv 8uc3等。float 是32位的,對應cvmat資料結構引數就是 cv 32fc1,cv 32fc2,cv 32fc3等。double是64位,對應cvmat資料結構引數...
opencv中資料型別
cv 32fc1和cv 64fc1,前者是32位資料,後者是64位資料。因此前者型別的資料必須以指向32位資料型別的指標訪問,否則會報錯,而後者型別的資料必須以指向64位資料型別的指標訪問,否則會報錯。也就是說,你如果用cv 32fc1,那麼後面對該矩陣的輸入輸出的資料指標型別都應該是float,這...
opencv學習 opencv的資料型別 2
cv rect類 矩陣類包含point類的x,y 矩陣左上角 size類的width和height 矩陣大小 預設構造 cv rect r 拷貝構造 cv rect r2 r1 數值初始化 cv rect r x,y,w h 點座標及大小初始化構造 cv rect r p,sz 兩點初始化構造 cv...