opencv笔记之图像创建、保存和复制
opencv基本操作
opencv基本操作OpenCV(OpenSourceComputerVisionLibrary)是一个开源计算机视觉库,是计算机视觉领域中最常用的库之一。
它由C++编写,支持Python、Java等多种编程语言。
OpenCV提供了各种各样的算法和函数,可用于图像处理、计算机视觉和机器学习等领域。
本文将介绍OpenCV的基本操作,包括图像的读取、显示、保存、颜色空间转换、图像缩放、图像平移、图像旋转、图像翻转、图像阈值化、图像平滑、边缘检测等。
1. 图像的读取、显示、保存OpenCV可以读取多种格式的图像文件,包括BMP、JPEG、PNG、TIFF等。
读取图像的函数是cv::imread(),语法如下:cv::Mat cv::imread(const string& filename, int flags = cv::IMREAD_COLOR);其中,filename是要读取的图像文件名,flags是读取图像的方式,可以是cv::IMREAD_COLOR(默认)、cv::IMREAD_GRAYSCALE(灰度图像)、cv::IMREAD_UNCHANGED(包括alpha通道的图像)等。
读取图像后,可以使用cv::imshow()函数将图像显示出来,语法如下: void cv::imshow(const string& winname, InputArray mat);其中,winname是窗口的名称,mat是要显示的图像。
最后,使用cv::imwrite()函数将图像保存到文件中,语法如下:bool cv::imwrite(const string& filename, InputArray img, const vector<int>& params = vector<int>());其中,filename是要保存的图像文件名,img是要保存的图像,params是保存图像的参数,比如JPEG的压缩质量等。
OpenCV常用的图像和矩阵操作总结
OpenCV常用的图像和矩阵操作总结
1.图像加载和保存
2.图像显示
3.图像基本操作
通过OpenCV,可以实现图像的基本操作,例如图像的缩放、平移、旋转和翻转。
cv2.resize(函数可以实现图像的缩放操作。
cv2.warpAffine(函数可以实现图像的平移、旋转和翻转操作。
4.彩色图像和灰度图像转换
5.图像的通道分离和合并
6.图像的滤波操作
7.图像的边缘检测
8.图像的直方图操作
9.图像的特征提取和匹配
10.图像的形态学操作
11.矩阵的创建和操作
OpenCV提供了多种方式来创建和操作矩阵。
可以使用cv2.create(函数创建矩阵,可以使用cv2.add(函数和cv2.subtract(函数对矩阵进行加减操作,可以使用cv2.multiply(函数和cv2.divide(函数对矩阵进行乘除操作。
12.矩阵的转置和逆矩阵
13.矩阵的乘法和求解
总结:OpenCV提供了丰富的图像和矩阵操作功能,包括图像的加载
和保存、图像的基本操作、图像的滤波和边缘检测、图像的直方图和特征
提取、图像的形态学操作,以及矩阵的创建和操作、矩阵的转置和逆矩阵、矩阵的乘法和求解等。
这些操作可以满足各种计算机视觉应用的需求。
C++openCV图像的读取、显示、保存、信息
C++openCV图像的读取、显⽰、保存、信息OpenCV⽀持bmp、jpg、png、tiff等常⽤图像格式的解析#include <opencv2/opencv.hpp> //头⽂件int main(){cv::Mat img = cv::imread("./tu/马.jpg", cv::IMREAD_UNCHANGED); //读⼊⼀张图⽚/*参数2:图像⽂件解析的⽅式,⽀持的⽅式有如下:cv::IMREAD_UNCHANGED 不对图像⽂件进⾏任何转换,直接读取【读⼊完整图⽚,包括alpha通道(png有,jpg⽆)】IMREAD_GRAYSCALE 将任何图像均转换为灰度图像(单通道)进⾏读取IMREAD_COLOR 将任何图像均转为RGB彩⾊图像(三通道)进⾏读取【默认参数,读⼊⼀副彩⾊图⽚,忽略alpha通道】IMREAD_ANYDEPTH 如果不设置这个参数,16/32位图像将会⾃动转为8位图像IMREAD_ANYCOLOR 将按照图像⽂件设定的颜⾊格式进⾏图像读取IMREAD_LOAD_GDAL 调⽤gdal库进⾏图像⽂件读取。
(可以简单地理解为读取TIFF图像⽂件)*/imshow("new", img); //在窗⼝中显⽰载⼊的图⽚//参数1:窗⼝标题,如果找不到参数1的窗⼝就新建⼀个//imread读⼊的图像//imshow函数只⽀持8位灰度图像、8位彩⾊图像和32位灰度图像(像素值范围0-1)cv::waitKey(6000);img = cv::imread("./tu/猫.jpg", cv::IMREAD_UNCHANGED);imshow("new", img);cv::waitKey(6000); // 等待6000 ms}#include <opencv2/opencv.hpp>int main(){cv::Mat img = cv::imread("./tu/马.jpg", cv::IMREAD_UNCHANGED);int w = img.cols; //返回图⽚的宽度int h = img.rows; //返回图⽚的⾼度unsigned char* p = img.data; //数据缓存区指针unsigned int x = (unsigned int)p;x = img.channels(); //返回通道数x = img.elemSize();//返回的是⼀个像素占⽤的字节数x = img.elemSize() / img.channels() * 8; //深度std::cout << x << std::endl;cv::waitKey(6000);}cv::Mat img = cv::imread("./tu/马.jpg", cv::IMREAD_UNCHANGED);std::vector<int> compression_params;compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);compression_params.push_back(50);cv::imwrite("my.jpg", img, compression_params); //保存图⽚//参数1:⽂件名//参数2:Mat类型的矩阵/*参数3:[可选]表⽰为特定格式保存的参数编码,std::vector<int>类型看:https:///mars_xiaolei/article/details/62233900?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCom */。
opencv基本知识及其操作
opencv基本知识及其操作OpenCV是一个开源的计算机视觉和机器学习软件库,它包含了丰富的计算机视觉和机器学习算法。
以下是OpenCV的一些基本知识和操作:1. 图像读取、显示和保存:OpenCV提供了读取、显示和保存图像的函数。
例如,使用()函数可以读取图像,()函数可以显示图像,()函数可以保存图像。
2. 摄像头和视频读取:OpenCV提供了读取摄像头和视频文件的函数。
例如,使用()函数可以打开摄像头或视频文件,并读取其中的帧。
3. 图像处理:OpenCV提供了许多图像处理函数,包括裁剪、旋转、缩放、模糊等。
例如,使用()函数可以调整图像大小,使用()函数可以应用模糊效果。
4. 颜色空间转换:OpenCV支持多种颜色空间,包括BGR、HSV、灰度等。
可以使用()函数进行颜色空间转换。
5. 特征检测和匹配:OpenCV提供了特征检测和匹配的算法,例如SIFT、SURF、ORB等。
这些算法可以在图像中检测关键点和特征,并进行匹配。
6. 图像变换:OpenCV提供了多种图像变换算法,包括透视变换、仿射变换等。
可以使用()和()函数进行透视变换,使用()函数进行仿射变换。
7. 图像滤波:OpenCV提供了多种图像滤波算法,包括高斯滤波、中值滤波、边缘检测等。
可以使用()函数进行高斯滤波,()函数进行中值滤波,()函数进行边缘检测。
8. 深度学习:OpenCV支持使用深度学习算法进行目标检测和识别。
可以使用预训练的模型进行人脸识别、物体检测等任务。
以上是OpenCV的一些基本知识和操作,通过学习和实践这些内容,可以更好地掌握OpenCV并进行计算机视觉任务的开发。
OpenCV看书笔记 所有基本操作 图形
struct _IplROI *roi;//图像ROI,若不为NULL则表示需要处理的图像区域
char *imageDataOrigin;//指针指向图像数据原点(用来校准图像存储单元的重新分配)
double* db; // 针对double矩阵的数据指针
CvMatND //N-维数组
int type;//元素类型(uchar,short,int,float,double)
int dims; // 数组维度
union data;
....
break;
case 'i':
...
break;
}
}
处理滚动条事件:
int pos=cvGetTrackbarPos("bar1","win1");
设定滚动条位置:
cvSetTrackbarPos("bar1","win1",25);
图像数据结构
IPL图像:
{
switch(event){
case CV_EVENT_LBUTTONDOWN:
if(flags & CV_EVENT_FLAG_CTRLKEY)
printf(Left button down with CTRL pressed\n);
GUI命令:
窗口管理
建立并放置一个窗口
cvNamedWindow("win1",CV_WINDOW_AUTOSIZE);
cvMoveWindow("win1",100,100);//以屏幕左上角为起点的偏移量
opencv图像处理常用操作一
opencv图像处理常⽤操作⼀读取显⽰图像# 读取并显⽰图像import cv2path_to_image = r'pby.jpg'"""第⼆个参数1 读取彩⾊,默认0 读取灰度图-1 加载图像,包括alpha通道"""original_image = cv2.imread(path_to_image, 1)cv2.imshow('original image', original_image)cv2.waitKey(0)cv2.destroyAllWindows()dWindow('image', cv2.WINDOW_NORMAL)cv2.imshow('image', original_image)cv2.waitKey(0)cv2.destroyAllWindows()# 保存图像import cv2img = cv2.imread('pby.jpg', 0)cv2.imshow('image', img)k = cv2.waitKey(0)if k == 27: # 等待ESC退出cv2.destroyAllWindows()elif k == ord('s'): # 等待关键字,保存和退出cv2.imwrite('gray.png', img)cv2.destroyAllWindows()使⽤本⽂章不深⼊讲解matplotlib的使⽤,后续更新matplotlib的详细使⽤教程"""OpenCV加载的彩⾊图像处于BGR模式。
但是Matplotlib以RGB模式显⽰。
"""import cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('pby.jpg', 0)plt.imshow(img, cmap='gray', interpolation='bicubic')plt.xticks([]), plt.yticks([]) # 隐藏 x 轴和 y 轴上的刻度值plt.show()访问摄像头import cv2 as cvcap = cv.VideoCapture(0) # 参数可以是0-3,0表⽰默认摄像头print("width is %s" % cap.get(cv.CAP_PROP_FRAME_WIDTH))print("height is %s" % cap.get(cv.CAP_PROP_FRAME_HEIGHT))if cap.set(cv.CAP_PROP_FRAME_WIDTH, 320):print('width now sets to 320')if cap.set(cv.CAP_PROP_FRAME_HEIGHT, 240):print('height now sets to 240')if not cap.isOpened():print("Cannot open camera")exit()while True:# 逐帧捕获ret, frame = cap.read()# 如果正确读取帧,ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")breakgray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显⽰结果帧cv.imshow('frame', gray)if cv.waitKey(1) == ord('q'):break# 完成所有操作后,释放捕获器cap.release()cv.destroyAllWindows()读取视频⽂件import cv2 as cvcap = cv.VideoCapture('output.avi') # 传⼊视频路径while cap.isOpened():ret, frame = cap.read()# 如果正确读取帧,ret为Trueif not ret:print("Can't receive frame (stream end?). Exiting ...")breakgray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)cv.imshow('frame', gray)if cv.waitKey(25) == ord('q'):breakcap.release()cv.destroyAllWindows()写视频⽂件import cv2 as cvcap = cv.VideoCapture(0)# if cap.set(cv.CAP_PROP_FRAME_WIDTH, 320):# print('width now sets to 320')# if cap.set(cv.CAP_PROP_FRAME_HEIGHT, 240):# print('height now sets to 240')fourcc = cv.VideoWriter_fourcc(*'XVID') # 定义编解码器并创建VideoWriter对象out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))while cap.isOpened():ret, frame = cap.read()if not ret:print("Can't receive frame (stream end?). Exiting ...")break# gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)out.write(frame)cv.imshow('frame', frame)if cv.waitKey(1) == ord('q'):break# 完成⼯作后释放所有内容cap.release()out.release()cv.destroyAllWindows()在图像上画形状、⽂字import cv2 as cvimport numpy as np# 创建⿊⾊的图像img = np.zeros((512, 512, 3), np.uint8)# 绘制⼀条厚度为5的蓝⾊对⾓线cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)# 画矩形cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)# 画圆圈cv.circle(img, (447, 63), 63, (0, 0, 255), -1)# 画椭圆cv.ellipse(img, (256, 256), (100, 50), 0, 0, 180, 255, -1)# 画多边形pts = np.array([[10, 5], [20, 30], [70, 20], [50, 10]], np.int32)pts = pts.reshape((-1, 1, 2))pts2 = np.array([[255, 240], [198, 189], [99, 345]], np.int32)pts2 = pts2.reshape(-1, 1, 2)cv.polylines(img, [pts], True, (0, 255, 255)) # 闭合多边形cv.polylines(img, [pts2], False, (0, 255, 255)) # 只连接不闭合# 向图⽚中添加⽂本font = cv.FONT_HERSHEY_SIMPLEXcv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA) cv.imshow('img', img)cv.waitKey(0)cv.destroyAllWindows()import cv2 as cvimport numpy as npimport randomdef main():# ⿏标回调函数def draw_circle(event, x, y, flags, param):if event == cv.EVENT_LBUTTONDBLCLK:cv.circle(img, (x, y), random.randint(50, 200), (255, 0, 0), -1)# 创建⼀个⿊⾊的图像,⼀个窗⼝,并绑定到窗⼝的功能img = np.zeros((512, 512, 3), np.uint8)dWindow('image')cv.setMouseCallback('image', draw_circle)while True:cv.imshow('image', img)if cv.waitKey(20) & 0xFF == 27: # 按esc退出breakcv.destroyAllWindows()if __name__ == '__main__':main()轨迹栏的使⽤import cv2 as cvimport numpy as npdef nothing(x):pass# 创建⼀个⿊⾊的图像img = np.zeros((300, 512, 3), np.uint8)dWindow('image')# 创建颜⾊变化的轨迹栏cv.createTrackbar('R', 'image', 0, 255, nothing)cv.createTrackbar('G', 'image', 0, 255, nothing)cv.createTrackbar('B', 'image', 0, 255, nothing)# 为 ON/OFF 功能创建开关switch = 'OFF/ON'cv.createTrackbar(switch, 'image', 0, 1, nothing)while True:cv.imshow('image', img)k = cv.waitKey(1) & 0xFFif k == 27:break# 得到四条轨迹的当前位置r = cv.getTrackbarPos('R', 'image')g = cv.getTrackbarPos('G', 'image')b = cv.getTrackbarPos('B', 'image')s = cv.getTrackbarPos(switch, 'image')if s == 0:img[:] = 0else:img[:] = [b, g, r]cv.destroyAllWindows()访问像素点# 访问像素点def access_px():img = cv.imread('pby.jpg') # 加载彩⾊图像,默认是彩⾊图像px = img[100, 100] # 通过⾏和列坐标来访问像素值print(px) # [37 61 73]# 仅访问蓝⾊像素blue = img[100, 100, 0] # opencv读取图⽚是BGR格式print(blue) # 37img[100, 100] = [255, 255, 255] # 修改该坐标对应的像素值print(img[100, 100]) # [255 255 255]# 上⾯的⽅法通常⽤于选择数组的区域,例如前5⾏和后3列。
OpenCv?图像创建、保存和复制
OpenCv 图像创建、保存和复制图像创建、保存和复制代码:#include "cv.h"#include "highgui.h"#include "stdio.h"void main(void){IplImage* pImg; //声明IplImage指针char* filename = "E:\\学习\\OpenCV\\picture\\Lena.jpg"; //图像名pImg = cvLoadImage(filename,1) ; //载入图像//看是否能成功载入if (pImg==0)printf("Can't find the picture!:(\n"); //不能载入else{printf("Can find the image!:)\n"); //成功载入IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels);cvCopy(pImg, pImg2, NULL);char* filename2 = "E:\\学习\\OpenCV\\picture\\Lena_New.jpg"; //图像名cvSaveImage(filename2, pImg2);//把图像写入文件cvNamedWindow( "Image", 1 );//创建窗口cvShowImage( "Image", pImg );//显示图像cvNamedWindow( "Image2", 1 );//创建窗cvShowImage( "Image2", pImg2 );//显示图像cvWaitKey(0); //等待按键cvDestroyWindow( "Image" );//销毁窗口cvReleaseImage( &pImg ); //释放图像cvDestroyWindow( "Image2" );//销毁窗口cvReleaseImage( &pImg2 ); //释放图像}}cvCreateImage函数-- Cxcore数组操作创建头并分配数据IplImage* cvCreateImage( CvSize size, int depth, int channels );size图像宽、高.depth图像元素的位深度,可以是下面的其中之一:IPL_DEPTH_8U - 无符号8位整型IPL_DEPTH_8S - 有符号8位整型IPL_DEPTH_16U - 无符号16位整型IPL_DEPTH_16S - 有符号16位整型IPL_DEPTH_32S - 有符号32位整型IPL_DEPTH_32F - 单精度浮点数IPL_DEPTH_64F - 双精度浮点数channels每个元素(像素)的颜色通道数量.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1 ...虽然通常IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能处理他, 但是这个函数只能创建交叉存取图像.函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式header = cvCreateImageHeader(size,depth,channels);cvCreateData(header); //只是创建空间,并不会初始化空间内的数据cvCopy函数-- Cxcore数组操作拷贝一个数组给另一个数组void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );src输入数组。
python之cv2与图像的载入、显示和保存实例
python之cv2与图像的载⼊、显⽰和保存实例本⽂是OpenCV 2 Computer Vision Application Programming Cookbook读书笔记的第⼀篇。
在笔记中将以Python语⾔改写每章的代码。
PythonOpenCV的配置这⾥就不介绍了。
注意,现在OpenCV for Python就是通过NumPy进⾏绑定的。
所以在使⽤时必须掌握⼀些NumPy的相关知识!图像就是⼀个矩阵,在OpenCV for Python中,图像就是NumPy中的数组!如果读取图像⾸先要导⼊OpenCV包,⽅法为:import cv2读取并显⽰图像在Python中不需要声明变量,所以也就不需要C++中的cv::Mat xxxxx了。
只需这样:img = cv2.imread("D:\cat.jpg")OpenCV⽬前⽀持读取bmp、jpg、png、tiff等常⽤格式。
更详细的请参考OpenCV的参考⽂档。
接着创建⼀个窗⼝dWindow("Image")然后在窗⼝中显⽰图像cv2.imshow("Image", img)最后还要添上⼀句:cv2.waitKey (0)如果不添最后⼀句,在IDLE中执⾏窗⼝直接⽆响应。
在命令⾏中执⾏的话,则是⼀闪⽽过。
完整的程序为:import cv2img = cv2.imread("D:\\cat.jpg")dWindow("Image")cv2.imshow("Image", img)cv2.waitKey (0)cv2.destroyAllWindows()最后释放窗⼝是个好习惯!创建/复制图像新的OpenCV的接⼝中没有CreateImage接⼝。
即没有cv2.CreateImage这样的函数。
如果要创建图像,需要使⽤numpy的函数(现在使⽤OpenCV-Python绑定,numpy是必装的)。
python opencv复现copyto方法
要在Python中使用OpenCV复现copyTo方法,首先需要安装OpenCV库。
可以使用以下命令安装:```bashpip install opencv-python```接下来,我们可以使用以下代码复现copyTo方法:```pythonimport cv2import numpy as np创建一个空白图像image = np.zeros((3, 3), dtype=np.uint8)print("原始图像:")print(image)创建一个与原始图像大小相同的掩码mask = np.ones((3, 3), dtype=np.uint8)print("掩码:")print(mask)将掩码应用于原始图像masked_image = cv2.bitwise_and(image, image, mask=mask)print("应用掩码后的图像:")print(masked_image)创建一个与原始图像大小相同的目标图像target_image = np.zeros((3, 3), dtype=np.uint8)print("目标图像:")print(target_image)将原始图像复制到目标图像的指定位置x, y = 1, 1result = cv2.copyTo(src=image, mask=mask, dst=target_image)print("复制后的图像:")print(result)```这段代码首先创建了一个空白图像、一个掩码和一个目标图像。
然后,它将掩码应用于原始图像,并将结果存储在一个新的图像中。
最后,它使用`cv2.copyTo()`函数将原始图像复制到目标图像的指定位置。
基于python-opencv3的图像显示和保存操作
基于python-opencv3的图像显⽰和保存操作基于python-opencv3的图像显⽰和保存操作,具体代码如下所⽰:import cv2 as cvimport numpy as np #导⼊库print("-------------------------------")image = cv.imread("D:/1.jpeg") #写⼊图像cv.imshow("image",image) #显⽰cv.waitKey() #等待cv.destroyAllWindows() #关闭所有窗⼝cv.imwrite("D:\\2.jpeg",image) #保存图像⾸先要导⼊cv2 和 numpy函数库,第四⾏的cv.imread()函数⽤于写⼊⼀个图像,imred()函数原型Mat imread(const String& filename,int flags = IMREAD_COLOR);返回Mat对象,第⼀个参数是⽂件的绝对路径,但并不是⽀持所有⽂件对象,它⽀持的⽂件如下:l Windows bitmaps - *.bmp, *.dib (always supported)l JPEG files - *.jpeg, *.jpg, *.jpe (see the Notes section)l JPEG 2000 files - *.jp2 (see the Notes section)l Portable Network Graphics - *.png (see the Notes section)l WebP - *.webp (see the Notes section)l Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)l Sun rasters - *.sr, *.ras (always supported)l TIFF files - *.tiff, *.tif (see the Notes section)l OpenEXR Image files - *.exr (see the Notes section)l Radiance HDR - *.hdr, *.pic (always supported)l Raster and Vector geospatial data supported by Gdal (see the Notes section)需要注意的是函数并不是靠识别后缀名,⽽是靠识别内容的编码。
OpenCV之加载、修改、保存图像
OpenCV之加载、修改、保存图像文章目录•••••oo加载图像(cv::imread)imread功能是加载图像文件成为一个Mat对象,其中•第一个参数表示图像文件名称•第二个参数,表示加载的图像是什么类型,支持常见的三个参数值•IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变•IMREAD_GRAYSCALE ( 0)表示把原图作为灰度图像加载进来•IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来注意:OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载例如:读名为test2.jpg// read imageMat image = imread("test2.jpg");修改图像(cv::cvtColor)void cv::cvtColor(cv::InputArray src, // 输入序列cv::OutputArray dst, // 输出序列int code, // 颜色映射码int dstCn = 0 // 输出的通道数 (0='automatic'));详细参数可以参考这篇博文:https:///xuwenwen_2013/article/details/78663379 代码案例:int main(){Mat src = imread("1.jpg", 1), dst;imshow("resoure", src);// 转为灰度图cvtColor(src, dst, CV_RGB2GRAY);imshow("效果图", dst);cvWaitKey();return 0;}保存图像(cv::imwrite)bool imwrite(const string& filename,InputArray img,const vector<int>& params=vector<int>())•第一个参数const String& filename表示需要写入的文件名,必须要加上后缀,比如“123.png”。
OpenCV中保存不同深度图像的技巧
什么是图像深度很多人开始学习OpenCV之后,接触前面几个API就包括imwrite函数,而且很快知道了如何去保存Mat对象为图像,常规代码如下:imwrite("D:/result.png ", dst);其中dst是Mat对象。
这样保存的图像默认是每个通道8位的字节图像,常见的RGB图像是图像深度为24,这个可以通过windows下查看图像属性获得,截图如下:如果每个通道占16位的话,RGB图像深度就会变成48,如果每个通道占32位的话,深度就会变成96,显然图像深度越大,图像文件也会越多,加载时候消耗的内存也会越多,所以OpenCV中默认读写图像都是每个通道8位(单字节)图像。
重温imwrite函数假设我们想保存图像为16位或者32位浮点数图像时候,我们该怎么去做,在开始之前我们首先再次复习一下OpenCV中保存图像的API函数-imwritebool cv::imwrite(const String & filename,InputArray img,const std::vector< int > & params = std::vector< int >())Filename 参数为声明的文件保存路径Img参数表示的是将要保存的Mat图像对象Params 表示的是保存图像时的选项,这些选项包括PNG/JPG/WEBP/TIFF压缩质量、格式选择等,可以分为如下四个大类•ImwriteEXRTypeFlags•ImwriteFlags•ImwritePAMFlags•ImwritePNGFlags,这里关于Params参数使用方式就不再赘述,主要是基于key-value方式添加到vector中去即可。
可以看这里OpenCV中原始图像加载与保存压缩技巧。
imwrite函数在关于保存为不同深度格式时候的图像类型支持说明如下:•8位的图像(CV_8U),支持png/jpg/bmp/webp等各种常见图像格式•16位的图像(CV_16U),支持png/jpeg2000/TIFF格式•32位的图像(CV_32F),支持PFM/TIFF/OpenEXR/TIFF/HDR在要保存为指定格式之前,可以通过convertTo或者cvtCOLOR进行图像类型或者通道转换之后,再调用imwrite进行保存。
从零开始opencv学习7_图片指定位置读取和指定位置保存
从零开始opencv学习7_图片指定位置读取和指定位置保存第1步:安装软件VS2015、opencv3.2 略第2步:配置环境变量path路径并重启略第3步:新建工程:文件/新建/项目/visual c++/win32控制台应用程序/命名:例如test/选路径/确定/下一步/空项目/完成第4步:VS与opencv建立连接:项目/属性/VC++ 目录--Include path(包含目录):(安装opencv目录到include)D:\VC\opencv\build\includeD:\VC\opencv\build\include\opencvD:\VC\opencv\build\include\opencv2--Lib path(库目录):D:\VC\opencv\build\x64\vc14\lib--链接器--输入--附加依赖项:二选一一个对应debug 一个对应releaseopencv_world320.libopencv_world320d.lib第5步:建立CPP程序文件方法一:右键点击源文件/添加/新建项/C++文件/添加第6步:复制下面的程序到cpp里。
第7步:下载一张jpg格式的图片,并命名为1第8步:复制图片1位置路径到程序替换注意:不能识别右斜线“\”,建议改为左斜线“/”第9步:设置要保存的图片地址并替换注意:不能识别右斜线“\”,建议改为左斜线“/”第10步:点击X86改为X64(我用的64位电脑系统)第11步:调试/开始执行详细程序:#include<iostream>#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>using namespace cv;int main() {Mat print;Mat img = imread("E:/study/vs2015 and Opencv Test/test7 imwrite_img/imwrite_img/1.jpg");// 读入一张图片namedWindow("原图");// 创建一个名为"原图"窗口imshow("原图", img);// 在窗口中显示img图/*VideoCapture v(0);waitKey(600);// 等待6000 ms后窗口自动关闭v >> print;imshow("截图", print);*/print = img;imwrite("E:/study/vs2015 and Opencv Test/test7 imwrite_img/imwrite_img/截图.jpg", print); //保存到对应路径下waitKey(6000);// 等待6000 ms后窗口自动关闭}。
opencv拷贝函数
在OpenCV中,有多种方式可以拷贝图像。
这里列举几个主要的方法:使用cv2.copy()函数:这是最直接的方法。
你可以使用cv2.copy()函数来拷贝一个图像。
这个函数会创建一个新的图像,并且复制所有像素值。
python复制代码import cv2# 读取图像image =cv2.imread('path_to_image.jpg')# 拷贝图像copied_image = image.copy()使用NumPy的切片:因为OpenCV的图像本质上是NumPy数组,所以你也可以使用NumPy的切片来拷贝图像。
这种方法也会创建一个新的图像,并且复制所有像素值。
python复制代码import cv2# 读取图像image =cv2.imread('path_to_image.jpg')# 拷贝图像copied_image = image[:, :]使用cv2.clone()函数:cv2.clone()函数与cv2.copy()相似,但它主要用于拷贝更复杂的对象,如矩阵。
对于简单的图像拷贝,cv2.copy()或NumPy切片通常更常用。
python复制代码import cv2# 读取图像image =cv2.imread('path_to_image.jpg')# 拷贝图像copied_image = cv2.clone(image)深拷贝与浅拷贝:在Python中,深拷贝和浅拷贝是两种不同的拷贝方式。
对于OpenCV中的图像,通常使用深拷贝,因为深拷贝会创建一个新的对象,并复制所有像素值。
而浅拷贝只创建一个新的引用,指向原始图像数据,不复制像素值。
因此,如果你修改了浅拷贝的图像,原始图像也会被修改。
深拷贝可以使用copy.deepcopy()来实现:python复制代码import cv2import copy# 读取图像image =cv2.imread('path_to_image.jpg')# 深拷贝图像deep_copied_image =copy.deepcopy(image)请注意,对于简单的图像数据,通常不需要使用deepcopy,因为cv2.copy()或NumPy切片已经提供了足够的深拷贝功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Main函数参数argc,argv说明
C/C++语言中的main函数,经常带有参数argc,argv,如下:
int main(int argc, char** argv)
int main(int argc, char* argv[])
这两个参数的作用: argc 是指命令行输入参数的个数(以空白符分隔) argv存储了所有的命令行参数假如你的程序是hello.exe,如果在命令行运行该程序,(首先应该在命令行下用cd 命令进入到hello.exe 文件所在目录)运行命令为:
hello.exe Shiqi Yu
那么,argc的值是3,argv[0]是"hello.exe",argv[1]是"Shiqi",argv[2]是"Yu"。
下面的程序演示argc和argv的使用:
#include <stdio.h>
int main(int argc, char ** argv)
{
int i;
for (i=0; i < argc; i++)
printf("Argument %d is %s.\n", i, argv[i]);
return 0;
}
假如上述代码编译为hello.exe,那么运行
hello.exe a b c d e
将得到
Argument 0 is hello.exe.
Argument 1 is a.
Argument 2 is b.
Argument 3 is c.
Argument 4 is d.
Argument 5 is e.
运行
hello.exe lena.jpg
将得到
Argument 0 is hello.exe.
Argument 1 is lena.jpg.
以上是解释pImg = cvLoadImage( argv[1], 0)) != 0
就是运行cmd命令后dos命令进入exe所在文件夹如我的操作是
记住girl.jpg先放和exe放在一个文件夹,执行cvSave_Copy.exe girl.jpg girl_copy.jpg 时中间有空格,在D:\VS\OpenCV\cvSave_Copy\Debug文件夹中就会出现一个girl_copy.jpg文件,且是经过灰度处理的,这样一幅图片的创建、复制、保存完成了
有一发现:把exe文件和jpg文件拷到C:\Documents and Settings\Administrator下,直接如下执行即可。