最近要做和計算機視覺相關的專案,就開始學習OpenCV了,買了《學習OpenCV3》這本書,發現是用C++撰寫的例程,就開始配置C++的環境,
配了一整天visual studio 2019,失敗,感覺原因一是自己確實不熟悉C++的dll和lib那一塊,對x64和x86也不熟悉,所以配置都得照著網上的說法弄,神奇的是,網上一個網頁一個說法,雖然都達成了最終目的,但總感覺不夠正規和簡潔,一怒之下還是在Anaconda上裝了OpenCV-Python,之前有做過C++和Python上OpenCV的區別調查,發現其實介面呼叫都差不多,執行效率也相差無幾(特別提到了numba)所以干脆就用Python了,
但在跟著書上C++的例程寫Python時還是遇到了一些問題,特此記錄,
第一個與遇到的比較重要的區別實在示例2-5里,原文C++代碼為
cv::Mat out cv::GaussianBlur( image, out, cv::Size(5, 5), 3, 3);
遇到第一個問題是 out 這個變數,一開始我以為 out 放到Python里應該變成
out = np.mat()
# 插曲:說到numpy,也是我之前發現,例程里的img.empty()沒法用,因為Python里沒有empty()這個函式,然后想到之前說到的numba可以優化Python的OpenCV所以想到Py-CV里的圖片檔案可能使用numpy的matrix保存的,View Code
之后想起來 np.mat() 應該傳入引數,但怎么可能預先知道讀取的圖片大小,于是改用了
out = None
然后把高斯模糊部分的代碼改為
cv.GaussianBlur(image, out, (5, 5), 3, 3)
然后發現報錯,要求輸入tunple型別,根據我寫Python的經驗和讀cv.GaussianBlur的引數,反應過來應該寫成
out = cv.GaussianBlur(image, (5, 5), 3, 3)
之后就跑通了,測驗檔案用的就是著名的512*512的Lenna
貼上example2_5的python對應代碼
import cv2 as cv import numpy as np def example2_5(image): # Create windows to show input and output cv.namedWindow("Example2_5-in", cv.WINDOW_AUTOSIZE) cv.namedWindow("Example2_5-out", cv.WINDOW_AUTOSIZE) # Create a window to show input image cv.imshow("Example2_5-in", image) out = cv.GaussianBlur(image, (5, 5), 3, 3) out = cv.GaussianBlur( out, (5, 5), 3, 3) # Show the smoothed image cv.imshow("Example2_5-out", out) cv.waitKey(0) if __name__ == '__main__': img = cv.imread("lenna.png") example2_5(img)View Code
之后做了書上的練習3,把示例2-11和2-6的代碼連接起來,建立一個讀取視頻并存盤降采樣后的彩色影像的程式,這里直接貼代碼
import cv2 as cv def GaussianBlur(image, show_win=False): # Gauss blur out = cv.GaussianBlur(image, (5, 5), 3, 3) out = cv.GaussianBlur(out, (5, 5), 3, 3) if show_win: cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.namedWindow("output image", cv.WINDOW_AUTOSIZE) # Show input image cv.imshow("input image", image) # Show output image cv.imshow("output image", out) # cv.waitKey(0) # return output image return out def DownSampling(image, show_win=False): # Gauss blur out = None out = cv.pyrDown(image) if show_win: cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.namedWindow("output image", cv.WINDOW_AUTOSIZE) # Show input image cv.imshow("input image", image) # Show output image cv.imshow("output image", out) # cv.waitKey(0) # return output image return out if __name__ == '__main__': cap = cv.VideoCapture() cap.open("demo.mp4") fourcc = cv.VideoWriter_fourcc('X', 'V', 'I', 'D') out_video = cv.VideoWriter("output.avi", fourcc, 29.97, (1280, 720)) while True: flag, frame = cap.read() if not flag: break out_frame = DownSampling(frame, True) out_video.write(out_frame) c = cv.waitKey(1) if c == 27: break cap.release() out_video.release() cv.destroyAllWindows()View Code
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/171044.html
標籤:其他
