Opencv学习笔记一Word文档下载推荐.docx

上传人:b****3 文档编号:17231922 上传时间:2022-11-29 格式:DOCX 页数:24 大小:1.59MB
下载 相关 举报
Opencv学习笔记一Word文档下载推荐.docx_第1页
第1页 / 共24页
Opencv学习笔记一Word文档下载推荐.docx_第2页
第2页 / 共24页
Opencv学习笔记一Word文档下载推荐.docx_第3页
第3页 / 共24页
Opencv学习笔记一Word文档下载推荐.docx_第4页
第4页 / 共24页
Opencv学习笔记一Word文档下载推荐.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

Opencv学习笔记一Word文档下载推荐.docx

《Opencv学习笔记一Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Opencv学习笔记一Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。

Opencv学习笔记一Word文档下载推荐.docx

opencv2\opencv.hpp>

#include<

iostream>

usingnamespacecv;

usingnamespacestd;

intmain()

{

cout<

"

helloopencv"

<

endl;

IplImage*plmg=cvLoadImage("

lena.jpg"

1);

//声明IplImage指针

cvNamedWindow("

Image"

//创建窗口

cvShowImage("

plmg);

//显示图像

cvWaitKey(0);

//等待按键如果没有这句,显示图片的那句就会一闪而过立刻销毁了

cvDestroyWindow("

);

cvReleaseImage(&

plmg);

return0;

}

注意:

1.这里用的是debugx64版本,要将vs中x86改成x64

2.图片放在项目的Debug下。

这里给出最新的opencv读图的方法

//!

[includes]

opencv2/core.hpp>

opencv2/imgcodecs.hpp>

opencv2/highgui.hpp>

string>

[namespace]

intmain(intargc,char**argv)

//!

[load]

StringimageName("

cute.jpg"

//bydefault

if(argc>

1)

{

imageName=argv[1];

}

[mat]

Matimage;

[imread]

image=imread(imageName,IMREAD_COLOR);

//Readthefile

if(image.empty())//Checkforinvalidinput

Couldnotopenorfindtheimage"

std:

endl;

return-1;

[window]

namedWindow("

Displaywindow"

WINDOW_AUTOSIZE);

//Createawindowfordisplay.

[imshow]

imshow("

image);

//Showourimageinsideit.

[wait]

waitKey(0);

//Waitforakeystrokeinthewindow

二Mat,图像的新容器

基础知识

自从版本2.0,OpenCV采用了新的数据结构,用Mat类结构取代了之前用extendedC写的cvMat和lplImage,更加好用啦,最大的好处就是更加方便的进行内存管理,对写更大的程序是很好的消息。

intmain(intargc,char*argv[])

//声明类

image=imread("

IMREAD_COLOR);

if(!

image.data){//Checkforinvalidinput

Matgray_image;

cvtColor(image,gray_image,CV_BGR2GRAY);

//将彩色图像变为灰度图像

imwrite("

Gray_Image.jpg"

gray_image);

//writepicture

Colorimage"

CV_WINDOW_AUTOSIZE);

Grayimage"

//原图

//灰色

Mat解析

1.Mat是一个类,有构造函数,赋值函数等

1MatA,C;

//createsjusttheheaderparts

2A=imread(argv[1],CV_LOAD_IMAGE_COLOR);

//herewe’llknowthemethodused(allocatematrix)

3MatB(A);

//Usethecopyconstructor

4C=A;

//Assignmentoperator

2.如果要拷贝自己的矩阵:

1MatF=A.clone();

2MatG;

3A.copyTo(G);

3.构造函数解析

MatM(2,2,CV_8UC3,Scalar(0,0,255));

M="

endl<

M<

构造2*2的矩阵。

CV_[Thenumberofbitsperitem][SignedorUnsigned][TypePrefix]C[Thechannelnumber]

CV_8UC3meansweuseunsignedchartypesthatare8bitlongandeachpixelhasthreeofthesetoformthethreechannels.

4.与原始的转换

IplImage*img=cvLoadImage("

greatwave.png"

Matmtx(img);

//convertIplImage*->

Mat

MatI;

IplImage*pI=&

I.operatorIplImage();

CvMat*mI=&

I.operatorCvMat();

5.改变矩阵creat()函数

不能用来初始化一个矩阵,它不是构造函数,它用来改变一个已有的矩阵的格式。

Create()function:

M.create(4,4,CV_8UC

(2));

cout<

6.Matlab类型初始化操作

MatE=Mat:

eye(4,4,CV_64F);

E="

E<

MatO=Mat:

ones(2,2,CV_32F);

O="

O<

MatZ=Mat:

zeros(3,3,CV_8UC1);

Z="

Z<

三图像处理的基本操作

Opencv图像处理基本操作

1基本数据类型

图像有若干个通道,灰度图像只有一个通道,而彩色具有红,绿,蓝组成,但是OpenCv以逆序的方式来存储三个分量,还可以使用第四个透明度(alpha),可以使用img.channels()获取图像通道个数。

使用若干个位存储一副图像的每个像素,这被称为图像的深度,灰度图像为8位,即0-255个灰度级,可以用img.depth()获得图像的深度,其返回值为:

CV_8U-8-bitunsignedintegers(0..255)

CV_8S-8-bitsignedintegers(-128..127)

CV_16U-16-bitunsignedintegers(0..65535)

CV_16S-16-bitsignedintegers(-32768..32767)

CV_32S-32-bitsignedintegers(-2147483648..2147483647)

CV_32F-32-bitfloating-pointnumbers(-FLT_MAX..FLT_MAX,INF,NAN)

CV_64F-64-bitfloating-pointnumbers(-DBL_MAX..DBL_MAX,INF,NAN)

对于灰度图像和彩色图像,最常见的是CV_8U.

Matimg=imread("

lena.png"

IMREAD_GRAYSCALE);

Matfp;

img.convertTo(fp,CV_32F);

//改变图像的深度

1

2

3

2像素级访问

1.第一种方法:

模板函数at<

>

ucharpixel=img.at<

uchar>

(0,0);

//获得灰度图像0,0点像素

Vec3bpixel=img.at<

Vec3B>

//获得3波段图像的第一个波段(0,0)像素。

第一种方法,效率不高,必须定位到他所在的位置

2.第二种方法:

函数ptr

他返回图像特定行的指针。

因此可以得到每一行的数据,时间复杂度降低,

如下代码获取一副彩色图像的每个像素值。

//时间复杂度大大降低!

ucharR,G,B;

for(inti=0;

i<

img.rows;

i++)//遍历行

Vec3bpixRow=img.ptr<

Vec3b>

(i);

for(intj=0;

j<

img.cols;

j++){//遍历**列**

B=pixRow[j][0];

G=pixRow[j][1];

R=pixRow[j][2];

测量程序用时可用函数:

doubleto=(double)getTickCount();

elapsed=((double)getTickCount()-to)/getTickFrenquency()

图像位运算

可以用掩码对一个图像进行处理,位元算有:

voidbitwise_and(InputArraysrc1,InputArraysrc2,OutputArraydst,InputArraymask=noArray())

其中src1是原始的图像,src2是掩码,dst为输出

一个例子:

intmain(){

Matimg=imread("

if(img.empty())

cannotloadimage"

Origin"

img);

Matmask(img.rows,img.cols,CV_8UC3,Scalar(0,0,0));

circle(mask,Point(img.rows/2,img.cols/2-35),220,Scalar(255,255,255),-1);

//画一个圆

Mask"

mask);

//执行位操作

Matr;

bitwise_and(img,mask,r);

Bit_and"

r);

如下所示的图像处理过程:

分别为原始图像,掩模,计算后的图像

1.Adding(blending)twoimagesusingOpenCV

将两张图像以线性组合的方式合并成一张图像,注意的是,两张图像的大小应该相同。

g(x)=(1-a

)*f0(x)+

a*f1(x)g(x)为生成的矩阵,f0(x),f1(x)为要合并的两个矩阵。

a为尺度。

用到的函数原型:

C++:

voidaddWeighted(InputArraysrc1,doublealpha,InputArraysrc2,doublebeta,doublegamma,OutputArraydst,intdtype=-1)

doublealpha=0.5;

doublebeta;

doubleinput;

Matsrc1,src2,dst;

///Asktheuserenteralpha

SimpleLinearBlender"

-----------------------"

*Enteralpha[0-1]:

;

cin>

input;

///Weusethealphaprovidedbytheuserifitisbetween0and1

if(input>

=0.0&

&

input<

=1.0)

alpha=input;

///Readimage(samesize,sametype)

src1=imread("

LinuxLogo.jpg"

src2=imread("

WindowsLogo.jpg"

src1.data){printf("

Errorloadingsrc1\n"

src2.data){printf("

Errorloadingsrc2\n"

///CreateWindows

LinearBlend"

beta=(1.0-alpha);

addWeighted(src1,alpha,src2,beta,0.0,dst);

dst);

当a=0时,此时只有window的logo

2.Changingthecontrastandbrightnessofanimage

改变图像的对比度和亮度

基础的公式为:

g(i;

j)=

a*f(i,j)+

b

whereiandjindicatesthatthepixelislocatedinthei-throwandj-thcolumn.

获得一个图片的像素我们用image.at<

(y,x)[c]这里的y为行,x为列,c代表R,GorB(0,1or2)

doublealpha;

/**<

Simplecontrastcontrol*/

intbeta;

Simplebrightnesscontrol*/

///Readimagegivenbyuser

Matimage=imread("

Matnew_image=Mat:

zeros(image.size(),image.type());

//copytheoriginpicturesize,andtype

///Initializevalues

BasicLinearTransforms"

-------------------------"

*Enterthealphavalue[1.0-3.0]:

alpha;

*Enterthebetavalue[0-100]:

beta;

///Dotheoperationnew_image(i,j)=alpha*image(i,j)+beta

for(inty=0;

y<

image.rows;

y++){

for(intx=0;

x<

image.cols;

x++){

for(intc=0;

c<

3;

c++){

new_image.at<

(y,x)[c]=

saturate_cast<

(alpha*(image.at<

(y,x)[c])+beta);

//saturate_casttomakesurethevaluesarevalid.

OriginalImage"

NewImage"

new_image);

waitKey();

示例如下:

可以看到改变的图片的对比度和亮度。

这里可以用函数image.convertTo(new_image,-1,alpha,beta);

来代替for循环,它会更有效率。

BasicDrawing

1.定义一个点2D

Pointpt;

pt.x=10;

pt.y=8;

Pointpt=Point(10,8);

2.画椭圆ellipse原型

voidellipse(InputOutputArrayimg,Pointcenter,Sizeaxes,

doubleangle,doublestartAngle,doubleendAngle,

constScalar&

color,intthickness=1,

intlineType=LINE_8,intshift=0);

后面三个为默认的参数,可以不写。

//自己写的函数,指定img,和角度

voidMyEllipse(Matimg,doubleangle)

intthickness=2;

intlineType=8;

ellipse(img,

Point(w/2,w/2),

Size(w/4,w/16),

angle,

0,

360,

Scalar(255,0,0),//为颜色

thickness,

lineType);

//**调用方法:

**

MyLine(rook_image,Point(0,15*w/16),Point(w,15*w/16));

3.画线段

函数原型

voidline(InputOutputArrayimg,Pointpt1,Pointpt2,constScalar&

color,

intthickness=1,intlineType=LINE_8,intshift=0);

RandomgeneratorandtextwithOpenCV

随机数产生类Ran

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1