学习OpenCV3(1)

最近要做和计算机视觉相关的项目,就开始学习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
posted @ 2020-10-12 18:32  BadFinG3r  阅读(243)  评论(0)    收藏  举报