opencv学习心得
来源:互联网 发布:山东临沂外包淘宝客服 编辑:程序博客网 时间:2024/06/14 02:37
Opencv学习(二)
1. 函数命名
cvAction(表示核心函数Set,Create)Target(图像区域)Mod(变量类型)
矩阵函数类型
通用CV_<bit_depth>(S|U|F)C<number_of_channels>
S:符号整数
U:无符号整数
F:浮点数
CV_8UC1 8位无符号整数单通道矩阵
图像数据类型
IPL_DEPTH_32F 表示32位浮点数图像
CVPoint p=cvPoint(int x,int y);
CVPoint2D32f p=cvPoint2D32f(float x,float y);
CVSize r=cvSize(int width,int height);
CVRect r=cvRect(intx,int y,int width,int height);
分配矩阵
CvMat*cvCreateMat(int rows,int cols,inttype);
CvMat*M=cvCreateMat(4,4,CV_32FC1);
cvReleaseMat(&M);
CvMat*cvCloneMat(CvMat*);复制矩阵。
CvMat*M1=cvCreateMat(4,4CV_32FC1);
CvMat*M2;
M2=cvCloneMat(M1);
初始化矩阵
Double a[ ]={1,2,3,4,
5,6,7,8,
9,10,11,12};
CvMatMa=cvMat(3,4,CV_64FC1,a);或;
CvMat Ma;
cvintMatHeader(&Ma,3,4,CV_64FC1,a);
访问矩阵
1. 直接访问
cvmSet(M,i,j,2,0);M(I,j)赋值
t=cvmGet(M,I,j);
已知对齐方式的直接访问:
CvMat*M =cvCreateMat (4,4,CV_32FC1);
Int n =M->cols;
Float *data =M->data.fl;
Data[ i*n+j]=3.0;
未知对齐方式的直接访问
CvMat*M =cvCreateMat (4,4,CV_32FC1);
Int step =M->step/sizeof/(float);
Float *data =M->data.fl;
(data+i*step)[j]=3.0;
直接访问一个已知初始化的矩阵
Double a[16];
CvMat Ma=cvMat(3,4,CV_64FCI,a);
A[i*4+j]=2.0
GUI命令
创建定位一个窗口:
cvNameWindow(“win1”,CV_WINDOW_AUTOSIZE);
cvMoveWindow(“win1”,100,100);
加载一幅图片
IplImage*img=0;
Img=cvLoadImage(fileName);
If(!img)printf(“Could not load image file:%s\n”,fileName);
显示一幅图像
cvShowImage(“win1”,img);
关闭窗口
cvDestroyWindow(“win1”);
缩放窗口
cvResizeWindow(“win1”,100,100);
分配一幅图像
IpIImage*img1=cvCreatImage(cvSize(640,480),IPL_DEPTH_8U,1);
cvReleseImage(&img);//释放一幅图像
IpIImage*img2;
Img2=cvCloneImage(img 1);
读入图像文件,先进行图像反转,然后将图像显示在屏幕上。
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<cv.h>
#include<highgui.h>
int main(intargc,char *argv[])
{
IplImage*img = 0;
int height, width,step, channels;
uchar *data;
int i, j, k;
if (argc < 2)
{
printf("Usage:InvImage<image-file-name>\n\7");
exit(0);
}
img= cvLoadImage(argv[1]);
if (!img)
{
printf("Could not load image file:%s\n",argv[1]);
exit(0);
}
height= img->height;
width= img->width;
step= img->widthStep;
channels= img->nChannels;
data= (uchar*)img->imageData;
printf("Processing a%dx%d image with %d channels\n", height, width, channels);
cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin", 100,100);
for (i = 0; i <height; i++)for (j = 0;j < width; j++) for (k = 0; k <channels; k++);
data[i*step+ j*channels + k] = 255 - data[i*step + channels + k];
cvShowImage("mainWin", img);
cvWaitKey(30);
cvReleaseImage(&img);
return 0;
}
从文件中读取图像
IplImage*img=0;
Img=cvLoadImage(filename);
If(!img)printf(“could not load image file:%s\n”,filename);
调整默认设置(3-通道)
Img=cvLoadImage,(filename,flag);>0(3通道)=0(单通道灰度图像)<0(图像的通道数决定);
向文件写图像:
If(!cvSeveImage(outFileName,img))
Printf(“Couldnot save:%s\n”,outFilename);
图片格式转换:
#include<cv.h>
#include<highgui.h>
#include<stdio.h>
int main(intargc,char**argv)
{
IplImage *src;
if (argc != 3)
{
printf("CONV:Image format convertion,supportJPG,BMP,TIE,PNG,PPM\n");
printf("Usage:conv srcImage dstImage\n");
return 0;
}
if (strstr(argv[1],".jpg")==NULL
&&strstr(argv[1],".bmp") ==NULL
&&strstr(argv[1],".tif") ==NULL
&&strstr(argv[1],".png") ==NULL
&&strstr(argv[1],".ppm") ==NULL)
||(strstr(argv[2], ".jpg") ==NULL
&&strstr(argv[2],".bmp") ==NULL
&&strstr(argv[2],".tif") ==NULL
&&strstr(argv[2],".png") ==NULL
&&strstr(argv[2],".ppm") ==NULL
))
{
printf("WARNING:CONV only suportJPG,BMP,TIF.PPM.TAG,andPPM\n");
}
else
{
if ((src =cvLoadImage(argv[1],-1)) != 0){
cvSaveImage(argv[2], src);
cvReleaseImage(&src);
printf("\n Convert succeesfully.\n");
}
else {
printf("\n*** Read or write image Fils***\n");
}
}
return 0;
}
访问图片元素
间接访问:
IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
CVScalar s;
S=cvGet2D(img,ij);
Printf(“intensity=%f\n”,s.val[0]);
s.val{0}=111;
cvSet2D(img,ij,s);
间接访问:
((uchar*)(img->imageData+i*img->widthStep))[j]=111;
多通道
((uchar*)(img->imageData+i*img->widthstep))[j*img->nChannels+0]=111;BGR
((uchar*)(img->imageData+i*img->widthstep))[j*img->nChannels+1]=112;
((uchar*)(img->imageData+i*img->widthstep))[j*img->nChannels+2]=113;
多通道浮点数用float*
指针直接访问;
Int height =img->height;
Int width=->img->width;
Int step=->img->widthStep/sizeof(unchar);
Uchar*data (uchar*)img->imageData;
Data[i*step+j]=111;
多通道 int channels= img ->nChannels;
Data[i*step+j*channels+k]=111;
将灰度图像转换成彩色图像
CvConvertImage(src,dst,flags=0);
浮点(单字节灰度(彩色)图像);
Flags CV_CVTIMG_FLIP.垂直翻转 CV_CVTIMG_SWAP_RB 交换R和B通道。。
彩色转换为灰色
CvCvtColor(cimg,gimg.CV_BGR2GRAY);
画矩形
cvRectangle(img,cvPoint(100,100),cvPoint(200,200),CVScalar(255,0,0),1);
画圆形
CvCircle(img,cvPoint(100,100),20,cvScalar(0,255,0),1);
画线段
cvLine(img,cvPoint(100,100) ,cvPoint(200,200),CVScalar(255,0,0),1);
画多边形
视屏的使用和操作
一.捕获某一帧
IpImage*img =0;
If(!cvGrabFrame(capture)){
Printf(“Could notgrab a frame\n\7”);
Exit(0);
}
保存视屏文件
初始化视频写入
对视屏写入并初始化
CvvideoWriter*writer=0;
Int isColor=1;
Int fps=25;
Int frameW=640;
Int frameH=480;
Writer=cvCreateVideoWriter(“out”)
CvtSeqToArray
CvMemStorage *stor;
CvSeq*cont;
CvPoint *PointArray;
CvPoint2D32f*PointArray2D32f;
Float temp;
Stor=cvCreateMemStorage(0);
Cont=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);
CvFlushSeq Writer
- OpenCV学习心得
- OPENCV学习心得
- opencv学习心得
- c++和opencv学习心得
- opencv学习心得二----读取图片
- opencv学习心得三----读取摄像头
- opencv学习心得四----读取视频文件
- opencv学习心得六----轮廓提取
- opencv学习心得七----画轮廓
- opencv学习心得九----椭圆拟合
- opencv学习心得十----圆拟合
- 暑假opencv学习心得----opencv的配置
- OpenCV源码阅读(3)---matx.h---学习心得
- opencv学习心得(四)——opencv提取截获图像
- 学习心得
- 学习心得
- 学习心得
- 学习心得
- 圣杯布局和双飞翼布局
- 挂断电话流程分析
- TensorFlow在windows环境下的安装(1)
- 试题库问题 最大流 输出方案
- Shared_ptr详解
- opencv学习心得
- 微信ios版本的两个灰度功能和一些小改变
- 2017-8-13
- javascript中的BOM
- 简单的旋转木马轮播
- 剑指Offer 含有Min函数的栈
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- codeforces 839 E. Mother of Dragons(最大团)
- c语言经典题算法1--用辗转相除法求两个数的最大公约数