OpenCV 学习资料

OpenCV 学习资料
OpenCV 学习资料

OpenCV 2.4.3 Cheat Sheet学习(一)

两年前用过OpenCV,感觉已经很爽了。这不,最近又要编个小程序,下了最新的OpenCV 2.4.3,呵呵,变化真大啊,叔叔几乎都认不出来了。

原来,现在的OpenCV要向MATLAB靠拢,图像的操作方法变得不那么C了,更m了一些。比如,MATLAB中的常用函数imshow、imread、imwrite函数在OpenCV中已经有了同名的兄弟。

此外,OpenCV 2.4.3中更加强调对矩阵的操作,以前的CvMat和CvArr目测现在正在被一个新成员Mat给后来居上了。

在doc目录里出现了一个Cheat Sheet,好家伙,原来是OpenCV的作弊纸呀,把基本用法整理成考试必备的模样,正好方便我们学习了。

所以,我们来共同学习一下吧:

一、矩阵基础操作:

Mat image(240, 320, CV8UC3);

第一个参数是rows,该矩阵的行数;第二个参数是cols,该矩阵的列数;第三个参数是该矩阵元素的类型。这句话表示创建一个大小为240×320的矩阵,里面的元素为8位unsigned型,通道数(channel)有3个。

image.create(480, 640, CV8UC3);

分配(或重新分配)image矩阵,把大小设为480×640,类型设为CV8UC3。

Mat A33(3, 3, CV_32F, Scalar(5));

定义并初始化一个3×3的32bit浮点数矩阵,每个元素都设为5。

Mat B33(3, 3, CV_32F);

B33 = Scalar(5);

和上面的作用一样。

Mat C33 = Mat::ones(3, 3, CV32F)*5.;

ones函数很像MATLAB里的语句吧。这句的意思是先定义一个3×3的32bit浮点数矩阵,元素全为1,所有元素再乘以5.0。

Mat D33 = Mat::zeros(3, 3, CV32F) + 5.;

和上面类似,先定义个3×3的32bit浮点数矩阵,元素全为0,再将所有元素加上5.0;

double a = CV_PI/3;

Mat A22 = (Mat_(2, 2) << cos(a), -sin(a), sin(a), cos(a));

CV_PI就是少年派的那个派。第二句这个写法很牛x的样子,我也没见过,不过看样子是创建一个2×2的float矩阵,把后面四个三角函数值分别赋给4个元素。float B22data[] = {cos(a), -sin(a), sin(a), cos(a)};

Mat B22 = Mat(2, 2, CV32F, B22data).clone();

第一句创建一个普通数组B22data,第二句创建一个2×2的32bit浮点数矩阵,并使用用B22data数组里的值初始化,然后克隆一下赋给B22矩阵。

为什么这里还要克隆一下,不是多此一举吗?不是的,用一个数组去初始化一个矩阵的话,你会发现这个矩阵引用了数组的内存地址。不克隆的话,上面例程的后果是B22data数组、Mat(2,2...)这个临时变量矩阵、B22矩阵这三把勺子都插在同一个碗里。

randu(image, Scalar(0), Scalar(256));

把image弄成一个符合正太分布的随机数矩阵,rand表示random,u表示uniform;第二个参数是随机数下限,方括号哦;第三个参数是随机数上限,圆括号。

randn(image, Scalar(128), Scalar(10));

高斯分布的随机数矩阵;第二个参数是均值,第三个参数是标差。

Mat image_alias = image;

没有拷贝里面的数据。

float* Idata=new float[480*640*3];

Mat I(480, 640, CV32FC3, Idata);

第一句定义一个480×640×3×sizeof(float)字节这么大的数组;第二句创建一个矩阵I,引用的是Idata的地址。

vector iptvec(10);

Mat iP(iptvec);

还能和STL一起用啊,以前真不知道。第一句话创建了一个有10个Point的向量,注意Point有两个int型元素。第二句创建了一个矩阵,元素类型根据就自动设为CV_32SC2,表示32bit signed int,2个channel。

IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);

Mat newC = cvarrToMat(oldC0);

IplImage oldC1 = newC;

CvMat oldC2 = newC;

这是为了把经典的OpenCV图像导成矩阵,第一句创建一个320×240的图像;第二句话把IplImage转成Mat;第三句话把Mat转成IplImage;第四句把Mat

转成CvMat。

Mat newC2 = cvarrToMat(oldC0).clone();

转换后克隆一下赋值。

vector ptvec = Mat(iP);

把Mat又转成vector。

(转来转去真复杂对吧)

A33.at(i,j) = A33.at(j,i)+1;

操作A33矩阵在row为i,col为j处的元素。需要显式指定A33里的元素类型,本例是float。

Mat dyImage(image.size(), image.type());

for(int y = 1; y < image.rows-1; y++)

{

Vec3b* prevRow = image.ptr(y-1);

Vec3b* nextRow = image.ptr(y+1);

for(int x = 0; y < image.cols; x++)

for(int c = 0; c < 3; c++)

dyImage.at(y,x)[c] = saturate_cast(nextRow[x][c] - prevRow[x][c]); }

第一句话创建一个和image大小、类型都一样的矩阵。

Vec3b是一个预定义的类型,三个无符号字符组成的向量:

typedef Vec Vec3b;

saturate_cast是一个强制类型转换,把圆括号里的东西转换为尖括号里的类型。for循环里的语句是把矩阵dyImage里的元素都赋值为后一行的值减去前一行的值,注意这个矩阵里的值是个具有三个元素的向量,理解为数组就行了,所以用方括号访问。

Mat::iterator it = image.begin(), itEnd = image.end();

for(; it != itEnd; ++it)

(*it)[1] ^= 255;

用过STL里的迭代器吗?用过的话就不解释了,没用过的还是先看看STL吧。对image每个值(Vec3b向量)的第一个元素和0xFF做异或。

OpenCV 2.4.3 Cheat Sheet学习(二)

二、矩阵操作(拷贝、洗牌、局部访问):

src.copyTo(dst)

把src矩阵中的数据拷贝到dst。

src.convertTo(dst, type, scale, shift)

缩放并转换到另外一种数据类型:

dst:目的矩阵

type:需要的输出矩阵类型,或者更明确的,是输出矩阵的深度,如果是负值(常用-1)则输出矩阵和输入矩阵类型相同

scale和shift:缩放参数,也可以写为alpha和beta

这个命令也等价于下面的转换公式:

m(x,y) = saturate_cast(α(*this)(x,y)+β)

m.clone()

深度拷贝(啥意思?看《C++ Primer》吧)

m.reshape(nch,nrows)

重设矩阵的通道数和行数,不拷贝数据。

nch:新的通道数,若为0则不变

nrows:新的行数,若为0则不变

m.row(i), m.col(i)

创建一个矩阵头,指向m矩阵的第i行/列,O(1)复杂度,不拷贝数据,新的矩阵头所代表的矩阵和m矩阵的第i行/列共享数据。

m.rowRange(Range(i1,i2))

m.colRange(Range(j1,j2))

创建一个矩阵头,指向m矩阵的第i1到i2行或者第j1到j2列,O(1)复杂度,不拷贝数据。

m.diag(i)

创建一个矩阵头,指向m矩阵的对角线,生成的是一个单列矩阵,O(1)复杂度,不拷贝数据。i=0时表示主对角线,i>0表示下半边的对角线,i<0表示上半边的对角线。

m(Range(i1,i2),Range(j1,j2))

从矩阵m中的第i1行到第i2行以及第j1列到第j2列所划定的范围提取一个小矩阵。

m.repeat(ny,nx)

把m矩阵贴马赛克,获取一个大矩阵,在y方向上重复ny次,在x方向上重复nx次。

flip(src,dst,dir)

翻转矩阵,dir是翻转方向,0表示沿x轴翻转,1表示沿y轴翻转,-1表示沿x 轴和y轴都进行翻转。

split(...)

把一个多通道矩阵分解为几个单通道矩阵,操作RGB图像之类的最常用了。

merge(...)

和上面的操作相反。

mixChannels(...)

上面两个函数的一般形式。

randShuffle(...)

把矩阵中的元素随机重排

示例1:

Mat imgroi = image(Rect(10, 20, 100, 100));

GaussianBlur(imgroi, imgroi, Size(5, 5), 1.2, 1.2);

第一句话取image的一个区域,第二句话对这个区域进行高斯平滑。

示例2:

m.row(i) += m.row(j)*alpha;

m矩阵的第j行乘以alpha后加到第i行中。

另外,在Mat::row的介绍中提到,在目前的实现中

A.row(i) = A.row(j);

这样的语句是不行的,改成

A.row(i) = A.row(j) + 0;

或者这样就可以了:

A.row(j).copyTo(A.row(i));

比较神奇~

示例3:

Rect r(1, 1, 10, 20);

Mat dstroi = dst(Rect(0,10,r.width,r.height));

src(r).convertTo(dstroi, dstroi.type(), 1, 0);

第一句定义一个矩形范围,第二句从dst矩阵中扣出一个ROI区域,第三句把src 矩阵中由r定义的范围转换到dstroi中。

三、简单矩阵操作

add(), subtract(), multiply(), divide(), absdiff(), bitwiseand(), bitwiseor(), bitwisex or(), max(), min(), compare()

分别是加减乘除、按位与或异或、最大最小之类的。

sum(), mean(), meanStdDev(), norm(), countNonZero(), minMaxLoc()

求和、均值、均值方差、矩阵范数、非零个数、最大最小值。

exp(), log(), pow(), sqrt(), cartToPolar(), polarToCart()

指数、对数、乘方、开放、极坐标转换。

scaleAdd(), transpose(), gemm(), invert(), solve(), determinant(), trace(), eigen(), SVD

线性组合、转置、广义矩阵乘法、矩阵求逆、解线性系统或最小二乘问题、计算行列式、矩阵的迹、计算对称矩阵的特征值和特征向量、奇异值分解

dft(), idft(), dct(), idct()

离散傅立叶变换、离散余弦变换

OpenCV 2.4.3 Cheat Sheet学习(三)

四、图像处理(呵呵,重头戏来了)

1.滤波

filter2D()

用核函数对图像做卷积。

sepFilter2D()

用分解的核函数对图像做卷积。

首先,图像的每一行与一维的核kernelX做卷积;然后,运算结果的每一列与一维的核kernelY做卷积。

boxFilter()

就是滑动窗口平均滤波的二维版。

GaussianBlur()

高斯平均,也就是高斯模糊。

medianBlur()

中值滤波,个人最爱的滤波函数。

bilateralFilter()

双线性滤波。

前面这四个函数是原来OpenCV里的cvSmooth()取不同参数的应用。

Sobel()

使用扩展Sobel 算子计算一阶、二阶、三阶或混合图像差分,看冈萨雷斯的那本《数字图像处理》。

Scharr()

计算一阶导,x方向或y方向,以前这个方法是放在cvSobel里的。

Laplacian()

拉普拉斯变换。

erode(), dilate()

腐蚀、膨胀。

示例:

filter2D(image, image, image.depth(), (Mat(3,3)<<-1, -1, -1, -1, 9, -1, -1, -1, -1), Point(1,1), 128);

构造了一个如下所示的核对图像做卷积:

-1 -1 -1

-1 9 -1

-1 -1 -1

核的锚点在(1,1)位置,卷积之后每个像素加上128.

1.几何变换

resize()

改变图像尺寸,可以指定x方向和y方向上的缩放比例,可以指定插值方法。getRectSubPix()

以亚像素精度从图像中提取矩形。

dst(x,y)=src(x+center.x-(dst.cols-1)*0.5,y+center.y-(dst.rows-1)*0.5)

其中非整数象素点坐标采用双线性插值提取。

warpAffine()

放射变换,看冈萨雷斯《数字图像处理》。

warpPerspective()

透射变换。

remap()

几何变换。

convertMaps()

这是啥?没用过,呵呵。

示例:

Mat dst;

resize(src, dst, Size(), 1./sqrt(2), 1./sqrt(2));

把图像缩小到原来的根号二分之一。

1.图像变换

cvtColor()

色彩空间转换。

顺便提一句,这个函数可以用于把CCD的raw格式转换为RGB,请参考:https://www.360docs.net/doc/137426205.html,/forum/viewtopic.php?f=1&t=18681

但是不能用于把灰度图转成伪彩图,请参考:

https://www.360docs.net/doc/137426205.html,/forum/viewtopic.php?f=1&t=23729

threshold()

二值化,常用操作,一般应用时建议用大津算法,即使用THRESH_OTSU参数。adaptivethreshold()

自适应阈值的二值化。

floodFill()

填充连通域。

integral()

计算积分图像,一次或者二次。

distanceTransform()

距离变换,对原图像的每一个像素计算到最近非零像素的距离。watershed()

分水岭图像分割。

grabCut()

一种彩色图像分割算法,效果可以参考这里:

https://www.360docs.net/doc/137426205.html,/xrwang/archive/2010/04/27/GrabCut.html 1.直方图

calcHist()

计算直方图。

calcBackProject()

计算反向投影。

equalizeHist()

灰度图像的直方图均衡化,常用操作。

compareHist()

比较两个直方图。

栗子:

Mat hsv, H;

cvtColor(image, hsv, CVBGR2HSV);

int planes[]=f0, 1g, hsize[] = f32, 32g;

calcHist(&hsv, 1, planes, Mat(), H, 2, hsize, 0);

计算图像的色调-饱和度直方图。

OpenCV 2.4.3 Cheat Sheet学习(四)

五、数据的输入和输出

1.将数据写入YAML(或XML)

注意,在OpenCV中,无论读写,文件的格式均由指定的后缀名确定。示例:FileStorage fs("test.yml", FileStorage::WRITE);

fs << "i" << 5 << "r" << 3.1 << "str" << "ABCDEFGH";

fs << "mtx" << Mat::eye(3,3,CV_32F);

fs << "mylist" << "[" << CV_PI << "1+1" << "{:" << "month" << 12 << "day" << 31 << "year" << 1969 << "}" << "]";

fs << "mystruct" << "{" << "x" << 1 << "y" << 2 << "width" << 100 << "height " << 200 << "lbp" << "[:";

const uchar arr[] = {0, 1, 1, 0, 1, 1, 0, 1};

fs.writeRaw("u", arr, (int)(sizeof(arr)/sizeof(arr[0])));

fs << "]" << "}";

读写方法基本和C++没什么两样,很简单哈。

用记事本或IE就可以打开test.yml文件,可以很清楚的看到文件中的数据结构:%YAML:1.0

i: 5

r: 3.1000000000000001e+000

str: ABCDEFGH

mtx: !!opencv-matrix

rows: 3

cols: 3

dt: f

data: [ 1., 0., 0., 0., 1., 0., 0., 0., 1. ]

mylist:

- 3.1415926535897931e+000

- "1+1"

- { month:12, day:31, year:1969 }

mystruct:

x: 1

y: 2

width: 100

height: 200

lbp: [ 0, 1, 1, 0, 1, 1, 0, 1 ]

1.将数据读回

FileStorage fs("test.yml", FileStorage::READ);

int i1 = (int)fs["i"];

double r1 = (double)fs["r"];

string str1 = (string)fs["str"];

Mat M;

fs["mtx"] >> M;

FileNode tl = fs["mylist"];

CV_Assert(tl.type() == FileNode::SEQ && tl.size() == 3);

double tl0 = (double)tl[0];

string tl1 = (string)tl[1];

int m = (int)tl[2]["month"], d = (int)tl[2]["day"];

int year = (int)tl[2]["year"];

FileNode tm = fs["mystruct"];

Rect r;

r.x = (int)tm["x"], r.y = (int)tm["y"];

r.width = (int)tm["width"], r.height = (int)tm["height"];

int lbp_val = 0;

FileNodeIterator it = tm["lbp"].begin();

for(int k = 0; k < 8; k++, ++it)

lbp_val |= ((int)*it) << k;

这段代码把上面写入文件的数据再读回来。

1.读写图像,最常用的操作

imwrite("myimage.jpg", image);

Mat imagecolorcopy = imread("myimage.jpg", 1);

Mat imagegrayscalecopy = imread("myimage.jpg", 0);

和MATLAB中的同名函数用法基本一样,很方便。文件格式由指定的后缀名确定。

imread可以指定读取图像的格式,参数0就是CV_LOAD_IMAGE_GRAYSCALE,即读取为灰度图;参数1就是CV_LOAD_IMAGE_COLOR,即读取为彩色图。可以支持如下文件格式:

BMP (.bmp), JPEG (.jpg, .jpeg), TIFF (.tif, .tiff), PNG (.png), PBM / PGM / PPM (.p bm, .pgm, .ppm), Sun Raster (.sr), JPEG 2000 (.jp2).

每种格式都支持8比特的单通道或3通道图像,PNG和JPEG2000格式支持16bit。

1.从文件或相机中读取视频

VideoCapture cap;

if(argc>1)

cap.open(string(argv[1]));

else

cap.open(0);

Mat frame;

namedWindow("video", 1);

for(;;)

{

cap >> frame;

if(!frame.data)

break;

imshow("video", frame);

if(waitKey(30) >= 0)

break;

}

如果指定了相机名称则打开对应的相机,否则打开默认相机0。打开一个名叫video的窗口,以30ms为间隔显示视频,也就是约33.33fps。

六、GUI(Graphical User Interface)组件

namedWindow(winname,flags)

创建一个窗口,用于显示。

destroyWindow(winname)

销毁一个窗口。

destroyAllWindows()

销毁所有窗口。

imshow(winname, mtx)

在指定的窗口中显示图像。

waitKey(delay)

等待delay毫秒,如果delay为0则一直等待。返回值是按键值,常用于显示图像的刷新和对按键的处理。

createTrackbar(...)

创建一个滑动条。

setMouseCallback(...)

设置鼠标事件的回调函数。

可以从camshiftdemo.cpp以及其他OpenCV示例工程中学习GUI的详细使用方法。

七、相机校准、姿态估计、深度估计

相机校准主要用到了张正友的棋盘格校准法,在OpenCV文件夹里可以找到棋盘格图像pattern.png,打印下来贴到一个硬板上就可以用以下函数对相机参数进行校准了。

calibrateCamera()

利用对棋盘格的一系列抓拍图像对相机进行校准。findChessboardCorners()

寻找棋盘格的角点。

剩下的我都没用过:

solvePnP()

stereoCalibrate()

stereoRectify()

initUndistortRectifyMap()

StereoBM, StereoSGBM

reprojectImageTo3D()

findHomography()

八、目标识别

matchTemplate

CascadeClassifier

HOGDescriptor

OpenCV主要函数介绍

4.1 OpenCV主要函数介绍 1) cvLoadImage 从文件中读取图像 IplImage* cvLoadImage(const char* filename,int flags=CV_LOAD_IMAGE_COLOR ); 函数cvLoadImage从指定文件读入图像,返回读入图像的指针。其中filename是要被读入的文件的文件名;flags指定读入图像的颜色和深度。 2)cvSaveImage 保存图像到文件 int cvSaveImage( const char* filename, const CvArr* image ); 函数cvSaveImage保存图像到指定文件。其中filename保存文件名。image 要保存的图像。图像格式的的选择依赖于filename的扩展名,只有8位单通道或者3通道(通道顺序为'BGR' )可以使用这个函数保存。 3)cvQueryFrame从摄像头或者文件中抓取并返回一帧 IplImage* cvQueryFrame( CvCapture* capture ); 函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。其中capture视频获取结构。。 4)cvCaptureFromCAM 初始化摄像头 CvCapture* cvCaptureFromCAM( int index ); 函数cvCaptureFromCAM给从摄像头的视频流分配和初始化CvCapture结构。 其中index要使用的摄像头索引。如果只有一个摄像头或者用哪个摄像头也无所谓,那使用参数-1应该便可以。 5)cvHaarDetectObjects 用来检测图像中的人脸区域 CV API(CvSeq*) cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade, CvMemStorage* storage, double scale_factor CV_DEFAULT(1.1), int min_neighbors CV_DEFAULT(3), int flags CV_DEFAULT(0), CvSize min_size CV_DEFAULT(cvSize(0,0)), CvSize max_size CV_DEFAULT(cvSize(0,0))); 用于快速检测人脸区域,便于提取得到人脸数据。其中image 为被检图像,cascade为 haar分类器级联的内部标识形式,storage 为用来存储检测到的一

opencv函数目录-Cv图像处理

目录 1 梯度、边缘和角点 1.1 Sobel 1.2 Laplace 1.3 Canny 1.4 PreCornerDetect 1.5 CornerEigenValsAndVecs 1.6 CornerMinEigenVal 1.7 CornerHarris 1.8 FindCornerSubPix 1.9 GoodFeaturesToTrack 2 采样、插值和几何变换 2.1 InitLineIterator 2.2 SampleLine 2.3 GetRectSubPix 2.4 GetQuadrangleSubPix 2.5 Resize 2.6 WarpAffine 2.7 GetAffineTransform 2.8 2DRotationMatrix 2.9 WarpPerspective 2.10 WarpPerspectiveQMatrix 2.11 GetPerspectiveTransform 2.12 Remap 2.13 LogPolar 3 形态学操作 3.1 CreateStructuringElementEx 3.2 ReleaseStructuringElement 3.3 Erode 3.4 Dilate 3.5 MorphologyEx 4 滤波器与色彩空间变换 4.1 Smooth 4.2 Filter2D 4.3 CopyMakeBorder 4.4 Integral 4.5 CvtColor 4.6 Threshold 4.7 AdaptiveThreshold 5 金字塔及其应用 5.1 PyrDown 5.2 PyrUp 6 连接部件 6.1 CvConnectedComp

cvPutText opencv中汉字的输出

cvPutText opencv中汉字的输出 OPENCV 不支持汉字输出,但可以修改其代码,支持汉字。字符输出在nitFont、cvPutText、cvGetSize三个函数中,文件在cxcore\src\cxdrawing.cpp 函数介绍: void cvlnitFont(CvFont*font,int font_face,double hscale,double vscale,double shear,int thickness,int line_type); /*font表示被初始化的字体结构体。font_face字体名称标识符,目前仅支持CV_FONT_HERSHEY_SIMPLEX等少数几种字体。hscale表示字体宽度的放大系数,例如0.5f表示宽度为原来的一半,shear字体豹裁瘦的斜率,1表示字体倾斜45度。thickness表示字体笔划的粗细程度。line_type表示字体笔划的类型,具体参见cvLine。*/ void cvPutText(CvArr *img,char+text,CvPoint org,CvFont *font,CvScalar color); /*img表示图像。这里要严格的ASCII字符,不能接受像GB2312等双字节编码。org表示第1个字符左下角的坐标。font表示字体结构体。color表示文本的字体颜色。*/ 字符编码:ASCII(一个字节),GB2313(两个字节),Unicode(两个字节).unicode兼容ASCII,不兼容GB,需要ANSI-C语言来转换.

思想如下: 1,解析汉字的编码;2,根据汉字编码装载汉字的形状;3,输出汉字的形状。 1,从char --> wchar_t 2,采用TrueType 字库。利用开源的FreeType库来处理字库。具体如下: 用FreeType的API提取一个字符的过程如下:{ FT_Library m_library;//字库 FT_Face m face;//字体 //打开字库文件,创建一个字体 FT_Init_FreeType(&m_library); FT_New_Face(m_library,"TrueType.ttf,0,&m_face); ∥根据字符的编码得到字符的索引位置 //根据字符在字库中索引得到字库轮廓 //根据字符的轮廓渲染字符的二值位图 FT_UInt glyph_index=FT_Get_Char_Index(m_face,'中'); FT_Load_Glyph(m_face,glyph_index,FT_LOAD_DEFAULT); FT_RenderGlyph(m_face->glyph,FT_RENDER_MODE_MONO); //释放FreeType库管理的资源 FT_Done_Face(m_face); FT_Done_FreeType(m_library);

OPENCV库函数使用说明

OPENCV(Intel Open Source Computer Vision Library)是一种数字图像处理和计算机视觉的函数库,由Intel公司微处理器实验室(Intel’s Microprocessor Research Lab)的视觉交互组(The Visual Interactivity Group)开发。它可以在Windows系统、Linux系统、MacOSx系统等操作平台上使用,也可以和其他编程工具结合,以满足不同的使用要求。使用OPENCV使用C/C++编写,包含300多个图像处理函数,有以下几个对立的子库组成: 1.CXCORE:一些基本函数(各种数据类型的基本运算等) 2.CV:图像处理和计算机视觉算法(图像处理、结构分析、运动分析、物体跟 踪和模式识别等) 3.HIGHGUI:用户交互部分(图形界面,图像视频输入输出,系统调用函数) 4.CVAUX:一些实验性的函数(三维跟踪等) 在这些库函数的支持下,用户可以直接调用滤波函数,形态学处理,图像特征提取,轮廓提取算法和跟踪算法,也可以添加自己编写的子函数,不但能完成复杂的开发任务,还可以提高效率,达到事半功倍的效果。 OPENCV的重要特性: 1.拥有包括300多个C函数的跨平台的中、高层API。它不依赖于其他的外部库——尽管也可以使用某些外部库。 2.对非商业应用和商业应用都是免费(FREE)的。 3.为Integrated Performance Primitives(IPP)提供了透明的接口。这意味着如果有为特定处理器优化的IPP库,OPENCV将在运行时自动加载这些库。 在VC++环境中OPENCV的使用设置: Microsoft公司开发的Visual C++是一种具有高度综合性能的软件开发工具。用它开发出的程序具有运行速度快,可移植能力强等优点,在对数字图像处理进行处理时经常采用Visual C++进行编程,通过对VC进行配置,就可以在编程过程中直接使用OPENCV的函数编写代码,减少了工作量,提高了运行效率。 在OPENCV安装完成后,首先需要把它的路径加入到系统环境变量中,然后再VC菜单Tools→Options→Directories下设置Library files路径,再选择Source files,最后选择Include files,就可以加入路径,如错误!未找到引用源。所示。设置完成后,就可以新建或打开一个使用OPENCV的工程。 打开工程后,选择菜单Project→Settings,然后将Setting for选为All Configurations,再选择右边的link标签,在Object/library modules加上工程属性中使用的库,这样就可以顺利编程。

opencv for c# 开发文档

OpenCV for Unity 1.2.3 iOS & Android support Win & Mac Standalone support(if Unity4,Pro only) Support for preview in the Editor(if Unity4,Pro only) Work with Unity Free & Pro System Requirements Build Win Standalone & Preview Editor : Windows7 or later Build Mac Standalone & Preview Editor : OSX 10.8 or later OpenCV for Unity is an Assets Plugin for using OpenCV from within Unity. ●Since this package is a clone of OpenCV Java, you can use as it is all the API Reference OpenCV Java 2.4.11 (link). (“org.opencv.android” and “SURF and SIFT of org.opencv.features2d” are excluded) ●You can image processing in real-time by using the WebCamTexture capabilities of Unity. (real-time face detection works smoothly in iPhone 5) ●Provides a method to interconversion of Unity's Texture2D and OpenCV's Mat. ●Includes many classes from OpenCVForUnity, and implements IDisposable. You can manage the resources with the "using" statement. Please download Demo Application for Android and watch Setup Tutorial Video(Unity4 Unity5). API Reference OpenCV for Unity SampleCode using OpenCV for Unity is available. ●MarkerBased AR Sample ●FaceTracker Sample ●Voforia with OpenCV for Unity Sample ●Kinect with OpenCV for Unity Sample

OPENCV函数

Opencv函数 分配图像空间: IplImage*cvCreateImage(CvSize size,int depth,int channels); size:cvSize(width,height); depth:IPL_DEPTH_8U,IPL_DEPTH_8S,IPL_DEPTH_16U, IPL_DEPTH_16S,IPL_DEPTH_32S,IPL_DEPTH_32F, IPL_DEPTH_64F channels:1,2,3or4. 注意数据为交叉存取.彩色图像的数据编排为b0g0r0b1g1 r1... 举例: //分配一个单通道字节图像 IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); //分配一个三通道浮点图像 IplImage*img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 释放图像空间: IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img); 复制图像: IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage*img2; img2=cvCloneImage(img1); 设定/获取兴趣区域: void cvSetImageROI(IplImage*image,CvRect rect); void cvResetImageROI(IplImage*image); vRect cvGetImageROI(const IplImage*image); 大部分OpenCV函数都支持ROI. 设定/获取兴趣通道: void cvSetImageCOI(IplImage*image,int coi);//0=all int cvGetImageCOI(const IplImage*image); 大部分OpenCV函数暂不支持COI.

C# OpenCV 初体验

[C#] OpenCV 初體驗 2011/05/17 在Visual Studio 2010 使用OpenCV 對於WebCam 有問題的話,請參考以下連結 https://www.360docs.net/doc/137426205.html,/Forums/zh-TW/230/thread/d1647ae6-7f61-453e-818a-2fa4f52592bb 一、簡介 以前研究所的時候,有使用https://www.360docs.net/doc/137426205.html, 配合OpenCV 做影像處理,這東西相當讚,可以省去不少開發時間,今天嘗試看看如何在Visual C# 2008 上使用OpenCV。 以下引用OpenCV 中文網站的介紹 1. 什麼是OpenCV OpenCV是Intel?開源電腦視覺庫。它由一系列C 函數和少量C++ 類構成,實現了圖像處理和電腦視覺方面的很多通用演算法。 2. OpenCV 重要特性 OpenCV 擁有包括300 多個C函數的跨平臺的中、高層API。它不依賴於其它的外部庫——儘管也可以使用某些外部庫。 OpenCV 對非商業應用和商業應用都是免費(FREE)的。(細節參考license)。 OpenCV 為Intel? Integrated Performance Primitives (IPP) 提供了透明介面。這意味著如果有為特定處理器優化的的IPP 庫,OpenCV 將在運行時自動載入這些庫。更多關於IPP 的信息請參考:https://www.360docs.net/doc/137426205.html,/software/products/ipp/index.htm 3. 體驗OpenCV 的魅力 看了以上對OpenCV的介紹,還是不知道OpenCV在做什麼的話,可以先看這段影片,影片的成果是透過OpenCV 所撰寫而成。 二、方法 1. 下載與安裝OpenCV 要使用OpenCV,首先必須要下載並且安裝,點這裡下載OpenCV_1.1pre1a.exe,下載後執行安裝,安裝過程幾乎都是點選下一步,在此需記住安裝目錄為何,預設為C:\Program Files\OpenCV。

OPenCV3.2中Mat对象常用函数属性总结

OPenCV3.2中Mat对象常用函数属性总结Mat对象是OpenCV2.0之后引进的图像数据结构,它能自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分。 在使用Mat对象时,有以下四个要点需要注意: 1、输出图像的内存是自动分配的 2、使用OpenCV的C++接口,不需要考虑内存分配问题 3、赋值操作和拷贝构造函数只会复制头部分 4、使用clone与copyTo两个函数实现数据完全复制 下面我们就具体介绍一下公共成员函数和公共属性。 公共成员函数: 1、cv::Mat::Mat ( int rows, int cols, int type ) 参数: rows2D数组中的行数 cols2D数组中的列数。 type数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。

2、cv::Mat::Mat ( Size size, int type ) 参数: size 2D数组大小:Size(cols, rows)。在Size()构造函数中,行数和列数以相反的顺序排列。 type 数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。 3、cv::Mat::Mat ( int rows, int cols, int type, const Scalar & s ) 参数: rows2D数组中的行数。 cols 2D数组中的列数。 type数组类型。使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。s 初始化每个矩阵元素的可选值。在构建后将所有矩阵元素设置为特定值, 使用赋值运算符Mat::operator=(const Scalar& value) 。 4、cv::Mat::Mat ( Size size, int type,

opencv配置

VS2010 + OpenCV2.3配置 ; 在VS2010下安装配置OpenCV2.3 ; 全程截图,绝对能配置好,不能的留言! 操作系统:Windows 7 x86 中文旗舰版; 编译环境:Visual Studio 2010 中文旗舰版; OpenCV版本:OpenCV-2.3.0-win、OpenCV-2.3.1-win; 备注: a、不需要Cmake编译!! b、如果是最新的2.3.1版本,则将下面第5步中的(5)和(6)中的名为230的lib 修改成231即可,否则会出现找不到lib的情况。 c、不分x86和x64版本,一律按照这个方案配置就可以使用。 d、C#开发环境下的配置方法: https://www.360docs.net/doc/137426205.html,/mvp_xuan/blog/item/7e6f6d8c4d34be09b31bb aa9.html?timeStamp=1316746687080 e、第5步属于“项目属性配置”,意思是:“每次新建或新打开一个项目,都需要重新配置”。1-4步是系统配置,一次性工程。 1、下载OpenCV(必须要superpack.exe) https://www.360docs.net/doc/137426205.html,/download/OpenCV-2.3.0-win-superpack.exe 2、安装 解压到D盘根目录下。(位置随便,不过下面的path需要根据实际情况自行修改了。) 3、设置系统环境变量 在用户变量处,新建PATH和OPENCV两个项: ———————————————————— PATH (只需添加下面中的一行,根据系统情况自行选择) D:\OpenCV2.3\build\x86\vc10\bin ———————————————————— OPENCV D:\OpenCV2.3\build ————————————————————

快速学习OPENCV常用函数

访问图像元素如下: 1、针对各种图像(包括4-通道)和矩阵的函数(cvGet2D,cvSet2D),但是它们都很慢. (img->origin=IPL_ORIGIN_TL)或者是左下角(img->origin=IPL_ORIGIN_BL) 假设有8-bit1-通道的图像I(IplImage*img): I(x,y)~((uchar*)(img->imageData+img->widthStep*y))[x] 假设有8-bit3-通道的图像I(IplImage*img): I(x,y)blue~((uchar*)(img->imageData+img->widthStep*y))[x*3] I(x,y)green~((uchar*)(img->imageData+img->widthStep*y))[x*3+1] I(x,y)red~((uchar*)(img->imageData+img->widthStep*y))[x*3+2] 如果增加点(100,100)的亮度30,那么可以: CvPoint pt={100,100}; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3]+=30; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+1]+=30; ((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+2]+=30; CvPoint pt={100,100}; uchar*temp_ptr=&((uchar*)(img->imageData+ img->widthStep*pt.y))[x*3]; temp_ptr[0]+=30; temp_ptr[1]+=30; temp_ptr[2]+=30; 假设有32-bit浮点数,1-通道图像I(IplImage*img): I(x,y)~((float*)(img->imageData+img->widthStep*y))[x] 现在,通用方法:假设有N-通道,类型为T的图像: I(x,y)c~((T*)(img->imageData+img->widthStep*y))[x*N+c] 或者你可使用宏CV_IMAGE_ELEM(image_header,elemtype,y,x_Nc) I(x,y)c~CV_IMAGE_ELEM(img,T,y,x*N+c) 2、访问矩阵元素 设有32-bit浮点数的实数矩阵M(CvMat*mat): M(i,j)~((float*)(mat->data.ptr+mat->step*i))[j] 设有64-bit浮点数的复数矩阵M(CvMat*mat): Re M(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2] Im M(i,j)~((double*)(mat->data.ptr+mat->step*i))[j*2+1]

OpenCV中文翻译教程

OPENCV2基础(补充材料) OpenCV_tutorials翻译资料整理而来 翻译材料出处: https://www.360docs.net/doc/137426205.html,/opencvdoc/2.3.2/html/doc/tutorials/tutorial s.html [2014/10]

目录 一、Mat - 基本图像容器 (2) 二、OpenCV如何扫描图像、利用查找表和计时 (9) 三、矩阵的掩码操作 (19) 四、使用OpenCV对两幅图像求和(求混合(blending)) (24) 五、改变图像的对比度和亮度 (27) 六、图像平滑处理 (33) 七、腐蚀与膨胀(Eroding and Dilating) (40) 八、实现自己的线性滤波器 (49) 九、给图像添加边界 (53) 十、Sobel 导数 (59) 十一、霍夫线变换 (65) 十二、直方图均衡化 (72) 十三、仿射变换 (77) 十四、Remapping 重映射 (85)

一、 Mat - 基本图像容器 目的 从真实世界中获取数字图像有很多方法,比如数码相机、扫描仪、CT或者磁共振成像。无论哪种方法,我们(人类)看到的是图像,而让数字设备来“看“的时候,则是在记录图像中的每一个点的数值。 比如上面的图像,在标出的镜子区域中你见到的只是一个矩阵,该矩阵包含了所有像素点的强度值。如何获取并存储这些像素值由我们的需求而定,最终在计算机世界里所有图像都可以简化为数值矩以及矩阵信息。作为一个计算机视觉库,OpenCV其主要目的就是通过处理和操作这些信息,来获取更高级的信息。因此,OpenCV如何存储并操作图像是你首先要学习的。 Mat 在2001年刚刚出现的时候,OpenCV基于C语言接口而建。为了在内存(memory)中存放图像,当时采用名为IplImage的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材料。但这种方法必须接受C语言所有的不足,这其中最大的不足要数手动内存管理,其依据是用户要为开辟和销毁内存负责。虽然对于小型的程序来说手动管理内存不是问题,但一旦代码开始变得越来越庞大,你需要越来越多地纠缠于这个问题,而不是着力解决你的开发目标。 幸运的是,C++出现了,并且带来类的概念,这给用户带来另外一个选择:自动的内存管理(不严谨地说)。这是一个好消息,如果C++完全兼容C的话,这个变化不会带来兼容性问题。为此,OpenCV在2.0版本中引入了一个新的C++接口,利用自动内存管理给出了解决问题的新方法。使用这个方法,你不需要纠结在管理内存上,而且你的代码会变得简洁(少写多得)。但C++接口唯一的不足是当前许多嵌入式开发系统只支持C语言。所以,当目标不是这种开发平台时,没有必要使用旧方法(除非你是自找麻烦的受虐狂码农)。

OpenCV最基础的图像处理的例子

?什么是OpenCV ?开源C/C++计算机视觉库. ?面向实时应用进行优化. ?跨操作系统/硬件/窗口管理器. ?通用图像/视频载入、存储和获取. ?由中、高层API构成. ?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口. ?特性: ?图像数据操作(分配,释放, 复制, 设定, 转换). ?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出). ?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD). ?各种动态数据结构(列表, 队列, 集, 树, 图). ?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔). ?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化). ?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配). ?动作分析(光流, 动作分割, 跟踪). ?对象辨识 (特征方法, 隐马可夫链模型HMM). ?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条). ?图像标识 (直线, 圆锥, 多边形, 文本绘图) ?OpenCV 模块: ?cv - OpenCV 主要函数. ?cvaux - 辅助(实验性) OpenCV 函数. ?cxcore - 数据结构与线性代数算法. ?highgui - GUI函数. 资料链接 ?参考手册: ?/docs/index.htm ?网络资源: ?官方网页: https://www.360docs.net/doc/137426205.html,/technology/computing/opencv/?软件下载: https://www.360docs.net/doc/137426205.html,/projects/opencvlibrary/ ?书籍: ?Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). ?视频处理例程(位于/samples/c/目录中): ?色彩跟踪: camshiftdemo ?点跟踪: lkdemo

win7+64(32)位系统+彻底Opencv安装+vs2012中文版

这两天在win7+64(32系统也只是在某些地方有区别,我会说明)位系统的vs2012中文版上永久配置了Opencv,发现装的时候遇到了好多问题,所以想总结一下。 一、安装OpenCV2.4.9 首先下载相应的软件(win7+64位系统和vs2012中文版的安装这里就不做过多的介绍了): 下载 OpenCV2.4.9: https://www.360docs.net/doc/137426205.html,/downloads.html (选择windows 系统的,不区分x86和x64) 我安装的目录是E:\opencv-2.4.9,大概有几个G,当然你也可以安装其他的版本,我没有试过,整体思路是一样的。 大概等几分钟就安装好了。 二、配置环境变量 点击计算机—>右击属性—>左侧高级系统设置—>高级—>环境变量 环境变量上面是用户变量,下册为系统变量。 1. 在用户变量下侧点击新建2项: 变量名:OPENCV,变量值:E:\opencv-2.4.9\opencv\build;如下图 变量名:PATH, 变量值:E:\opencv-2.4.9\opencv\build\x64\vc11\bin; E:\opencv-2.4.9\opencv\build\x86\vc11\bin 注意之间用分号分开,如下图。

2.在系统变量中找到path,必须注意,不要把系统变量path里面的值删除,而是向里面加入,以分号隔开,在里面加入以下路径 对于64位系统加入: E:\opencv-2.4.9\opencv\build\x64\vc11\bin; E:\opencv-2.4.9\opencv\build\x86\vc11\bin 对于32位系统加入: E:\opencv-2.4.9\opencv\build\x86\vc11\bin 弄完环境变量后,最好重启以下系统。当然在cmd中有些方法查看变量是否奏效,这里不再啰嗦,还有注意虽然我们是vs2012但是也要选vc11\bin这样的路径,而不是vc12\bin. 三、vs2012工程的配置 有些文档说每次新建工程都要重新配置,或者以一些啰嗦的方法配置如https://www.360docs.net/doc/137426205.html,/lysc_forever/article/details/24272595 里面说的方法,其实不用,我们完全一次性配置好而且简单,此方法是在https://www.360docs.net/doc/137426205.html,/poem_qianmo/article/details/19809337 里面学到的。 点开vs2012—>文件—>新建—>项目—>Win32控制台应用程序—>确定

opencv最基础的图像处理

openCV——几个实用函数 2010年12月20日星期一 09:18 1. cvSmooth:各种方法的图像平滑 void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 ); src 输入图像. dst 输出图像. smoothtype 平滑方法: . CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素的param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数cvIntegral 计算积分图像。 . CV_BLUR (simple blur) - 对每个象素param1×param2邻域求和并做尺度变换 1/(param1.param2). . CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为 param1×param2 的高斯卷积 . CV_MEDIAN (median blur) - 对图像进行核大小为 param1×param1 的中值滤波 (i.e. 邻域是方的). . CV_BILATERAL (双向滤波) - 应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2. 平滑操作的第一个参数. param2 平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果 param2的值为零,则表示其被设定为param1。 param3

对应高斯参数的 Gaussian sigma (标准差). 如果为零,则标准差由下面的核尺寸计算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核. 对小的卷积核 (3×3 to 7×7) 使用如上公式所示的标准 sigma 速度会快。如果 param3 不为零,而 param1 和 param2 为零,则核大小有sigma 计算 (以保证足够精确的操作). 函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。 没有缩放的图像平滑仅支持单通道图像,并且支持8位到16位的转换(与cvSobel和cvaplace相似)和32位浮点数到32位浮点数的变换格式。 简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特和 32-比特浮点图像。这两种方法可以(in-place)方式处理图像。 中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像. 2.IplImage结构 由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下: typedef struct _IplImage { int nSize; /* IplImage大小 */ int ID; /* 版本 (=0)*/

Opencv中函数的用法

1、cvLoadImage:将图像文件加载至内存; 2、cvNamedWindow:在屏幕上创建一个窗口; 3、cvShowImage:在一个已创建好的窗口中显示图像; 4、cvWaitKey:使程序暂停,等待用户触发一个按键操作; 5、cvReleaseImage:释放图像文件所分配的内存; 6、cvDestroyWindow:销毁显示图像文件的窗口; 7、cvCreateFileCapture:通过参数设置确定要读入的AVI文件; 8、cvQueryFrame:用来将下一帧视频文件载入内存; 9、cvReleaseCapture:释放CvCapture结构开辟的内存空间; 10、cvCreateTrackbar:创建一个滚动条; 11、cvSetCaptureProperty:设置CvCapture对象的各种属性; 12、cvGetCaptureProperty:查询CvCapture对象的各种属性; 13、cvGetSize:当前图像结构的大小; 14、cvSmooth:对图像进行平滑处理; 15、cvPyrDown:图像金字塔,降采样,图像缩小为原来四分之一; 16、cvCanny:Canny边缘检测; 17、cvCreateCameraCapture:从摄像设备中读入数据; 18、cvCreateVideoWriter:创建一个写入设备以便逐帧将视频流写入视频文件;搜索 19、cvWriteFrame:逐帧将视频流写入文件; 20、cvReleaseVideoWriter:释放CvVideoWriter结构开辟的内存空间; 21、CV_MAT_ELEM:从矩阵中得到一个元素; 22、cvAbs:计算数组中所有元素的绝对值;

opencv中的图像坐标和行列的关系

OpenCV中文站中有一篇关于OpenCV基础操作的文章《OpenCV 编程简介(矩阵/图像/视频的基本读写操作)入门必读》,上面对OpenCV的一些入门操作进行了详细的介绍。我也是看了这篇文章后才开始了OpenCV的编程。但是最近发现了一个理解上的小失误,导致一个问题困扰了很长时间。现在问题解决了,就把思考的过程写在这跟大家分享一下。 该文章其中有一部分是关于如何操作图像像素值的介绍: 基于指针的直接访问:(简单高效) IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); int height = img->height; int width = img->width; int step = img->widthStep/sizeof(uchar); uchar* data = (uchar *)img->imageData; data[i*step+j] = 111; 对像素值的访问,作者用了data[i*step+j]这样的格式,当时没怎么仔细想,就认为这是图像中坐标为(i, j)像素的值,其实并不是这样的。 首先,来看一下IplImage的结构,其中像素值存放在char *imageData指针做指向的区域,OpenCV官方文档中将其解释为"A pointer to the aligned image data",就是指向排列好的图像数据的指针。但是指针取出来,是一个一维数组data[i*step+j],是怎么体现出“排列好的”这个性质的呢?OpenCV用了一个辅助的变量来实现。就是IplImage的widthStep,它表示图像一行有多少个字节。用这个值除以一个像素所占的字节数,就可以得到一行有多少个像素。data[i*step+j]就是第i行第j个像素的像素值(i和j从0开始,这个应该不用我说吧)。 但是,如果用(i, j)来表示坐标的话,正好反了。因为行号是在列的方向递增的。比如说第5行,那么它的纵坐标应该是5-1。第五行的第几个,这个几才代表横坐标。 明白了这点就好办了,如果想用(i, j)同时来表示坐标和数组中的点,那么应该用data[i+j*step]。i在图像宽度范围内递增,j在图像高度范围内递增。如果图像宽和高非别为w和h,那么对像素的遍历可以用下面的循环搞定: for(int j = 0; j < h; j++) { for(int i = 0; i < w; i++) { printf("(%d, %d)=%d\t", i, j, data[i+j*step]); } } 以后就定义成data[i+j*step],方便后面的操作。一般情况下还是习惯i在前、j在后的格式。 (坐标是从0开始的,并且是相对图像原点的位置。图像原点或者是左上角(img->origin=IPL_ORIGIN_TL) 或者是左下角 (img->origin=IPL_ORIGIN_BL) )?假设有 8-bit 1-通道的图像 I (IplImage* img): I(x,y) ~ ((uchar*)(img->imageData + img->widthStep*y))[x] ?假设有 8-bit 3-通道的图像 I (IplImage* img): I(x,y)blue ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3] I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1] I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2] 例如,给点 (100,100) 的亮度增加 30 ,那么可以这样做:

OpenCv参考手册-CvAux中文参考手册

CvAux中文参考手册Wikipedia,自由的百科全书 目录 ? 1 立体匹配 o 1.1 FindStereoCorrespondence ? 2 View Morphing Functions o 2.1 MakeScanlines o 2.2 PreWarpImage o 2.3 FindRuns o 2.4 DynamicCorrespondMulti o 2.5 MakeAlphaScanlines o 2.6 MorphEpilinesMulti o 2.7 PostWarpImage o 2.8 DeleteMoire ? 3 3D Tracking Functions o 3.1 3dTrackerCalibrateCameras o 3.2 3dTrackerLocateObjects ? 4 Eigen Objects (PCA) Functions o 4.1 CalcCovarMatrixEx o 4.2 CalcEigenObjects o 4.3 CalcDecompCoeff o 4.4 EigenDecomposite o 4.5 EigenProjection ? 5 Embedded Hidden Markov Models Functions o 5.1 CvHMM o 5.2 CvImgObsInfo o 5.3 Create2DHMM o 5.4 Release2DHMM o 5.5 CreateObsInfo o 5.6 ReleaseObsInfo o 5.7 ImgToObs_DCT o 5.8 UniformImgSegm o 5.9 InitMixSegm o 5.10 EstimateHMMStateParams o 5.11 EstimateTransProb o 5.12 EstimateObsProb o 5.13 EViterbi o 5.14 MixSegmL2 [编辑]

相关文档
最新文档