C++和python两者的使用语法都是相同的
由两个参数决定:
imread(“图片的地址+名称”, 何种形式读取图片)
image = cv2.imread("C:/Opencv/lena.jpg", cv2.IMREAD_GRAYSCA) // python
cv::Mat image = cv::imread("C:/Opencv/lena.jpg", 0); // c++
第二个参数,可以使用标志参数,也可以使用简记数字。常用的就是
读取形式 标志参数 简记数字
以原图读取(针对有Alpha通道的图片) IMREAD_UNCHANGED -1
以单通道的灰度图像读取 IMREAD_GRAYSCA 0
以3通道BGR的彩色图片读取 IMREAD_COLOR 1
注意,缺省状态下是以3通道读取,并且是BGR的形式。
imread是从文件(磁盘)中直接读取图像数据,imdecode是从内存缓冲区中读取数据,并解码成图像格式。
使用imdecode的优点在于可以从内存中直接解码图像数据,而不需要将数据保存到磁盘再进行读取。在某些场景中是有用的,如网络传输的数据源,摄像头捕获的图像数据。
imdecode与image的使用有一点要注意:imread是传入图片路径,转为图片格式;imdecode传入的内存数据(数组形式),转为图片格式。就以上面的简单例子:从文件中读取图片。imdecode的python写法可以为下:
# 使用 NumPy 的 fromfile 函数从指定路径中读取图像数据,并将其存储为 NumPy 数组,作为参数传给imdecode解码成图像格式
image = cv2.imdecode(np.fromfile("C:/Opencv/lena.jpg", dtype = np.uint8), 1) # 1为标志参数,3通道读取
注:一般情况下,读取图像的像素数目小于2^30,这个要求在绝大多数图像处理领域都是不受影响的,但是对于超高分辨率图像的像素数目可能会超过这个阈值,可以通过修改系统变量中的OPENCV_IO_MAX_IMAGE_PIXELS参数调整能够读取的最大像素数目。
显示图片一般调试时使用,没有什么特别注意的(反正最终结果也要将其注释掉)。
常用三件套:1)显示图片窗口 2)窗口的持续时间或阻塞 3)销毁窗口
cv::imshow("Show", image); // "Show"是显示窗口的名称,image是读取的图片
//cv::waitKey(300) // 窗口持续300ms后关闭,继续后续程序
cv::waitKey(0); // 0 将会一直阻塞程序的执行,直到用户按下键盘上的任意键
cv::destroyAllWindows(); // 关闭程序中所有的窗口,一般用于程序的最后
注:如果原图分辨率太大,显示不完全怎么办? 使用namedWindow()这个窗口函数设置一下。
与读取imread相似,要给出具体保存的路径(地址+图片名)
cv::Mat image = cv::imread("C:/Opencv/lena.jpg", cv::IMREAD_GRAYSCALE);
cv::imwrite("C:/Opencv/temp/lena.jpg", image);
值得注意的是批量图片的保存。通常方法都是 :(固定的文件夹地址)+(流动的图片名)
imencode函数是将图像数据编码成流数据(如png格式,jpg格式),返回的是一个元组(bool,NumPy),第一个元素是布尔值,表示编码是否成功;第二个是编码后的数据——NumPy数组。若想把数据保存到文件中,还需要其他步骤,例如,python中使用.tofile(.tofile() 是 NumPy 数组的一个方法,用于将数组中的数据以二进制形式写入文件):
image = cv2.imdecode(np.fromfile("C:/Opencv/lena.jpg", dtype = np.uint8), -1)
cv2.imencode('.png', image)[1].tofile("C:/Opencv/temp/ena.png") // 索引[1]取出元组中的第二个元素,即编码后的图像数据
imdecode和imencode是进行与内存缓冲区之间的操作(而不是磁盘),在某些场景下更加高效,但C++中使用这两个比较繁琐,python中使用较为方便。