【Tool】OpenCV API Learning I

Tags: DIP

[TOC]

Opencv Data Types

basic data types

从c++集成过来,包含,int, float, points, rectangles, size...

  • cv::Vec<> fixed vector class 对小型数据比较高效。
    常见的是cv::Vec{2,3,4,6}{b,w,s,i,f,d}


    【Tool】OpenCV API Learning I_第1张图片
    55YBXu.png
  • cv::Matx<> fixed matrix class certain specific small matrix operations。实际上fixed vector是matrix特殊情况,column是1。
    常见的是cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d}


    【Tool】OpenCV API Learning I_第2张图片
    55Y3Qh.png

    【Tool】OpenCV API Learning I_第3张图片
    55Y5cH.png
  • cv::Point 点类,和fixed vector classes区别在于,通过成员变量访问, p.x p.y vector通过index访问。
    常见的是cv::Point2i, cv::Point2f, cv::Point2d, cv::Point3i, cv::Point3f, cv::Point3d


    【Tool】OpenCV API Learning I_第4张图片
    55zAjS.png
  • cv::Scalar 类,本质是有四个元素的vector。继承自cv::Vec,通过下标访问。


    【Tool】OpenCV API Learning I_第5张图片
    55zUAa.png
  • cv::Size, 实际上是cv::Size2i, 有width, height两个数据成员(第一个成员是width, 第二个是height)。如果要使用浮点坐标,cv::Size2f。

  • 【Tool】OpenCV API Learning I_第6张图片
    55V65J.png

    【Tool】OpenCV API Learning I_第7张图片
    55VA6l.png
  • cv::Rect, 有height, width, x, y四个成员。注意!Rect的x是横向坐标,y是纵向坐标(从构造器也可以看出)。


    【Tool】OpenCV API Learning I_第8张图片
    55VqgS.png

    【Tool】OpenCV API Learning I_第9张图片
    55VoUz.png
  • cv::RotatedRect,前面的是坐标轴对齐的矩形,这个是非坐标轴对齐的矩形。包含cv::Point2f的中心点,cv::Size2f是大小,float angle成员。

【Tool】OpenCV API Learning I_第10张图片
55VnOa.png
  • cv::complexf, cv::complexd


    【Tool】OpenCV API Learning I_第11张图片
    55Y9fN.png

helper objects

垃圾收集器,切片...

  • cv::TermCriteria
    程序终止条件
  • cv::Range
  • cv::Ptr
    智能指针,引用计数器。
    • addref(), release() 增加,减少引用计数器的数目。
    • empty(),查看引用指针指向的对象是否存在。
    • delete_obj()
  • cv::Exception()
  • cv::DataType<> template
  • cv::InputArray cv::OutputArray cv::InputOutputArray

other utility functions

  • cv::alignPtr() 对齐指针
  • cv::alignSize()
  • cv::allocate() 类似C的对象数组指针
  • cv::fastAtan2()
  • cvCeil: 比x大的最小整数
  • cv::cubeRoot
  • cv::CV_Assert() cv::CV_DbgAssert()
  • cv::CV_Error() CV_ERROR_)_
  • cv:error()
  • cv::fastFree()
  • cv::fastMalloc()
  • cvFloor(): 比x小的最大整数
  • cv::format()
  • cv::getCPUTickCount()
  • cv::getNumThreads()
  • cv::getOptimalDFTSize()
  • cv::getThreadNum()
  • cv::getTickCount()
  • cv::getTickFrequency()
  • cvIsInf()
  • cvIsNaN()
  • cvRound()
  • cv::setNumThreads()
  • cv::setUseOptimized()
  • cv::useOptimized()


    【Tool】OpenCV API Learning I_第12张图片
    55zKwz.png

    【Tool】OpenCV API Learning I_第13张图片
    55zes2.png

large array types

cv::Mat 下一章讲

Dynamic and Variable Storage

cv::Mat constructor

default constructor

  • 指定row, column
  • 传入 cv::Size
  • 多维数组,指定维数和每一维度大小
【Tool】OpenCV API Learning I_第14张图片
55YmOq.png

cv::Mat copy constructor

【Tool】OpenCV API Learning I_第15张图片
55YHIA.png

cv::Mat template constructor

【Tool】OpenCV API Learning I_第16张图片
55YX9O.png

【Tool】OpenCV API Learning I_第17张图片
55YFZ9.png

static member functions

【Tool】OpenCV API Learning I_第18张图片
55YzUe.png

accessing array elements

  • at<>() 方法
  • ptr<>() 方法
  • cv::MatIterator<>和cv::MatConstIterator<> 最慢的一种方式

NAryMatIterator()

Accessing Array Elements by Block

【Tool】OpenCV API Learning I_第19张图片
55YVnd.png

Matrix Expression

【Tool】OpenCV API Learning I_第20张图片
55Y0QR.png

【Tool】OpenCV API Learning I_第21张图片
55YQcr.png

Saturation Casting

防止数据overflow或者underflow

More Mat operations

【Tool】OpenCV API Learning I_第22张图片
55YjXi.png

【Tool】OpenCV API Learning I_第23张图片
55YGZy.png

cv::SparseMat

accessing sparse array

  • cv::SparseMat::ptr()
  • cv::SparseMat::ref()
  • cv::SparseMat::value()
  • cv::SparseMat::find()
  • cv::SparseMatItearator_() cv::SparseMatConstIterator_()

functions unique to sparse array

【Tool】OpenCV API Learning I_第24张图片
55YhiK.png

template structure for large array types

可以简化代码:

// 不使用模板函数
cv::Mat m(10, 10, CV_32FC2);
m.at(i0,i1) = cv::Vec2f(x,y);
// 使用模板
cv::Mat_ m(10,10);
m.at(i0,i1) = cv::Vec2f(x,y);
// or
m(i0,i1) = cv::Vec2f(x,y);

Array Operations

  • cv::abs()
cv::MatExpr cv::abs(cv::Inputarray src);
cv::MatExpr cv::abs(const cv::MatExpr& src);
  • cv::absdiff()
void cv::absdiff(cv::InputArray src1, cv::InputArray src2, cv::OutputArray dst);
// dst_i = saturate({src1_i - src2_i|)
  • cv::add()
void cv::add(cv::InputArray src1, cv::InputArray src2, cv::OutputArray dst, cv::InputArray mask = cv::noArray(), int dtype=-1);
  • cv::addWeighted() alpha blending
void cv::addWeighted(cv::InputArray src1, double alpha, cv::InputArray src2, double beta, double gamma, cv::OutputArray dst, int dtype=-1);
  • cv::bitwise_and()
  • cv::bitwise_not()
  • cv::bitwise_or()
  • cv::bitwise_xor()
  • cv::calcCovarMatrix() 计算n维向量的协方差
void cv::calcCovarMatrix(const cv::Mat* samples, int nsamples, cv::Mat& covar, cv::Mat& mean, int flags, int ctype=cv::F64);
void cv::calcCovarMatirx(cv::InputArray samples, cv::Mat& covar, cv::Mat& mean, int flags, int ctype=cv::F64);
  • cv::calcToPolar() 计算两个向量之间的角度和梯度
void cv::cartToPolar(cv::InputArray x, cv::InputArray y, cv::OutputArray magnitude, cv::OutputArray angle, bool angleInDegrees = false);
  • cv::checkRange() 检查值范围
bool cv::checkRange(cv::InputArray src, bool quiet=true,  cv::Point* pos=0, double minVal=-DBL_MAX, double maxVal=DBL_MAX);
  • cv::compare()
bool cv::compare(cv::InputArray src1, cv::InputArray src2, cv::OutputArray dst, int cmpop);
  • cv::completeSymm()

  • cv::convertScaleAbs()

void cv::convertScaleAbs(cv::InputArray src, cv::OutputArray dst, doubel alpha=1.0, double beta=0.0);
  • cv::countNonZero()
int cv::coutNonZero(cv::InputArray mtx);
  • cv::cvarrToMat() 新旧格式转换
cv::Mat cv::cvarrToMat(const CvArr* src, bool copyData=false, bool allowND = true, int coiMode = 0); 
  • cv::dct()
void cv::dct(cv::InputArray src, cv::OutputArray dst, int flags)
  • cv::dft()
void cv::dft(cv::InputArray src, cv::OutputArray dst, int flags=0, int nonzeroRows=0);
  • cv::cvtColor() 颜色空间转换,比较常用
void cvtColor(cv::InputArray src, cv::OutputArray dst, int code, int dstCn = 0);
  • cv::determinant()
double cv::determinant(cv::InputArray mat);
  • cv::divide()
void cv::divide(cv::InputArray src1, cv::InputArray src2, cv::OutputArray dst, double scale=1.0, int dtype=-1);

void cv::divide(double scale, cv::InputArray src2, cv::OutputArray dst, double int dtype=-1);
  • cv::eigen()
bool cv::eigen(cv::InputArray src, cv::OutputArray eigenvalues, int lowindex=-1, int high index=-1);
  • cv::exp()
void cv::exp(cv::InputArray src, cv::OutputArray dst);
  • cv::extractImageCOI()
bool cv::extractImageCOI(const cvArr* arr, cv::OutputArray dst, int coi=-1);
  • cv::flip() 图片翻转
void cv::flip(cv::InputArray src, cv::OutArray dst, int flipCode=0);
  • cv::gemm() general matrix multiplication ,数据类型是浮点
void cv::gemm(cv::InputArray src1, cv::InputArray src2, double alpha, cv::InputArray src3, double beta, cv::OutputArray dst, int flags=0);
  • cv::getConvertElem() cv::getConvertScaleElem()

  • cv::idct()

  • cv::idft()

  • cv::inRange() 阈值判断,生成掩码图像

void cv::ingRange(cv::InputArray src, cv::InputArray upperb, cv::InputArray lowerb, cv::OutputArray dst);
  • cv::insertImageCOI()

  • cv::invert() 求矩阵逆

double cv::invert(cv::InputArray src, cv::Output Array dst, int method = cv::DECOMP_LU);
  • void cv::log()

  • void cv::LUT() 查表变换, 如果lut和src维度一样,输出一维,如果lut是一维,输出和src维度一样。

void cv::LUT(cv::InputArray src, cv::InputArray lut, cv::OutputArray dst);
  • cv::magnitude()
void cv::magnitude(cv::InputArray x, cv::InputArray y, cv::OutputArray dst);
  • cv::Mahalanobis()
cv::Size cv::mahalanobis(cv::InputArray vec1, cv::InputArray vec2, cv::OutputArray icovar);
  • cv::max()

  • cv::mean()

  • cv::meanStdDev()

  • cv::merge()

  • cv::min()

void merge(const vector& mv, cv::OutputArray dst);
  • cv::minMaxIdx()
void cv::minMaxIdx(cv::InputArray src, double* minVal, double* maxVal, int* minIdx, int* maxIdx, cv::InputArray mask cv::noArray());

void cv::minMaxIdx(const cv::SparseMat& src, double* minVal, double* maxVal, int* minIdx, int* maxIdx);
  • cv::minMaxLoc()
void cv::minMaxLoc(cv::InputArray src, double* minVal, double* maxVal, cv::Point* minLoc, cv::Point* maxLoc, cv::InputArray mask = cv::noArray());

void cv::minMaxLoc(const cv::SparseMat& src, double* minVal, double* maxVal, cv::Point* minLoc, cv::Point* maxLoc);
  • cv::mixChannels() 更一般的split, merge, cvtColor吧
void cv::mixChannels(const cv::Mat* srcv, int nsrc, cv::Mat* dstv, int ndst, const int* fromTo, size_t, n_pairs);
  • cv::mulSpectrums()
double void cv::mulSpectrums(cv::InputArray src1, cv::InputArray arr2, cv::OutputArray dst, int flags, bool conj = false);
  • cv::multiply()
void cv::multiply(cv::InputArray src1, cv::InputArray src2, cv::OutputArray dst, double scale=1.0, int dtype = -1);
  • cv::mulTransposed(): 计算矩阵和它自己转置的乘积
void cv::mulTransposed(cv::InputArray src1, cv::OutputArray dst, bool aTa, cv::InputArray delta = cv::noArray(), double scale = 1.0, int dtype = -1);
  • cv::norm()
double cv::norm(cv::InputArray src1, int normType = cv::NORM_L2, cv::InputArray mask = cv::noArray());

double cv::norm(cv::InputArray src1, cv::InputArray src2, int normType = cv::NORM_L2, cv::InputArray mask=cv::noArray());

double cv::norm(const cv::SparseMat& src, int normType = cv::NORM_L2);
  • cv::normalize()
void cv::normalize(cv::InputArray src1, cv::OutputArray dst, double alpha = 1, double beta = 0, int normType = cv::NORM_L2, int dtype=-1, cv::InputArray mask = cv::noArray());
  • cv::perspectiveTransorm
cv::perspectiveTransform(cv::InputArray src, cv::OutputArray dst, cv::InputArray mtx);
  • cv::polarToCart()
void cv::polarToCart(cv::InputArray magnitude, cv::InputArray angle, cv::OutputArray x, cv::OutputArray y, bool angleInDegrees=false);
  • cv::pow()
void cv::pow(cv::InputArray src, double p, cv::OutputArray dst);
  • cv::randu() 均匀分布
template _Tp randu();

void cv::randu(cv::InputOutArray mtx, cv::InputArray low, cv::InputArray high);
  • cv::randn() 正态分布
void cv::randn(cv::InputOutArray mtx, cv::InputArray mean, cv::InputArray stddev);
  • cv::randShuffle() 随机重新排列
void cv::randShuffle(cv::InputOutArray mtx, double iterFactor = 1, cv::RNG* rng=NULL);
  • cv::reduce()
void cv::reduce(cv::InputArray src, cv::OutputArray vec, int dim, int reduceOp = cv::REDUCE_SUM, int dtype = -1);
  • cv::repeat()
void cv::repeat(cv::InputArray src, int nx, int ny, cv::OutputArray dst);

cv::Mat cv::repeat(cv::InputArray src, int nx, int ny);
  • cv::scaleAdd()
void cv::scaleAdd(cv::InputArray src1, double scale, cv::InptuArray src2, cv::OutputArray dst);
  • cv::setIdentity()
void cv::setIdentity(cv::InputOutputArray dst, const cv::Scalar& value = cv::Scalar(1.0));
  • cv::solve()
int cv::solve(cv::InputArray lhs, cv::InputArray rhs, cv::OutputArray dst, int method = cv::DECOMP_LU);
  • cv::solveCubic()
int cv::solveCubic(cv::InputArray coeffs, cv::OutputArray roots);
  • cv::solvePoly()
int cv::solvePoly(cv::InputArray coeffs, cv::OutputArray roots, int maxIters = 300);
  • cv::sort()
void cv::sort(cv::InputArray src, cv::OutputArray dst, int flags);

flags: cv::SORT_EVERY_ROW cv::SORT_EVERY_COLUMN cv::SORT_ASCENDING cv::SORT_DESCENDING

  • cv::sortIdx()
void cv::sortIdx(cv::InputArray src, cv::OutputArray dst, int flags);

flags: cv::SORT_EVERY_ROW cv::SORT_EVERY_COLUMN cv::SORT_ASCENDING cv::SORT_DESCENDING

  • cv::split()
void cv::split(const cv::Mat& mtx, cv::Mat* mv);

void cv::split(const cv::Mat& mtx, vector& mv);
  • cv::sqrt()
void cv::sqrt(cv::InputArray src, cv::OutputArray dst);
  • cv::subtract()
void cv::subtract(cv::InputArray  src1, cv::InputArray src2, cv::OutputArray dst, cv::InputArray mask = cv::noArray(), int dtype = -1);
  • cv::sum()
cv::Scalar cv::sum(cv::InputArray arr);

+cv::trace()

cv::Scalar cv::trace(cv::InputArray mat);
  • cv::transform()
void cv::transform(cv::InputArray src, cv::OutputArray dst, cv::InputArray mtx);
  • cv::transpose()
void cv::transpose(cv::InputArray src, cv::OutputArray dst);

Drawing and Annotating

opencv 画图函数一般都接受三个参数 color, thickness, line type(4,8, LINE_AA)

cv::circle()

void cv::circle(cv::Mat& img, cv::Point center, int raius, const cv::Scalar& color, int thickness = 1, int lineType = 8, int shift = 0);

cv::clipLine() 判断线段是否在矩形内

bool clipLine(cv::Rect imgRect, cv::Point& pt1, cv::Point& pt2);

bool clipLine(cv::Size imgSize, cv::Point& pt1, cv::Point& pt2);

cv::ellipse()

bool ellipse(cv::Mat& img, cv::Point center, cv::Size axes, double angle, double startAngle, double endAngle, const cv::Scalar& color, int thickness=1, int lineType=8, int shift=0);

// 在一个矩形框中画一个椭圆
bool ellipse(cv::Mat& img, const cv::RotatedRect& rect, const cv::Scalar& color, int thickness=1, int lineType=8, int shift=0);

cv::ellipse2Poly() // 椭圆外接多边形

void ellipse2Poly(cv::Point center, cv::Size axes, double angle, double startAngle, double endAngle, int delta, vector& pts);

cv::fillConvexPoly()

void fillConvexPoly(cv::Mat& img, const cv::Point* pts, int npts, const cv::Scalar& color, int lineType = 8, int shift = 0):

cv::fillPoly() 可以有intersection

void fillPoly(cv::Mat& img, const cv::Point* pts, int npts, int ncontours, const cv::Scalar& color, int lineType=8, int shift=0, cv::Point offset=Point());

cv::line()

void line(cv::Mat& img, cv::Point pt1, cv::Point pt2, const cv::Scalar& color, int thickness=1, int lineType=8, int shift=0);

cv::rectangle()

void rectangle(cv::Mat& img, cv::Point pt1, cv::Point pt2, const cv::Scalar& color, int thickness = 1, int lineType=8, int shift = 0);

void rectangle(cv::Mat& img, cv::Rect r, int thickness=1, const cv::Scalar& color, int lineType=8, int shift=0);

polyLines()

void polyLines(cv::Mat& img, const cv::Point* pts, int npts, int ncontours, bool isClosed, const cv::Scalar& color, int lineType=8, int shift=0);

cv::LineIterator

LineIterator::LineIterator(cv::Mat& img, cv::Point pt1, cv::Point pt2, int lineType = 8, bool leftToRight = false);

cv::putText()

void cv::putText(cv::Mat& img, const string& text, cv::Point origin, int fontFace, doubel fontScale, cv::Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false);

cv::getTextSIze() 获得合适的输入文字大小

cv::Size cv::getTextSize(const string& text, cv::Point origin, int fontFace, double fontScale, int thickness, int* baseLine);

Functors

PCA

cv::PCA::PCA()

cv::PCA::operator()()

cv::Mat PCA::project(cv::InputArray vec

cv::PCA::backProject()

SVD

cv::SVD()

cv::SVD::operator()()

cv::SVD::compute()

RNG

cv::theRNG() 默认随机数生成器

cv::RNG()

cv::RNG(void)
cv::RNG::RNG(uint64 state)

cv::RNG::operator T() 生成特别类型的随机数

int(rng)
(int)rng

cv::RNG::operator()

unsigned int cv::RNG::operator()();
unsigned int cv::RNG::operator(unsigned int N);

cv::RNG::uniform()

int cv::RNG::uniform(int a, int b); //float, double

cv::RNG::gaussian()

double cv::RNG::gaussian(double sigma);

cv::RNG::fill()

void cv::RNG::fill(InputOutputArray mat, int distType, InputArray a, InputArray b);

Image Video and Data Files

HighGUI library

  • hardware part: 相机操作
  • filesystem part: 图像/XML/YML读取
  • GUI part:

Loading and Saving Images

  • load
cv::Mat cv::imread(const string& filename, int flags=cv::IMREAD_COLOR);
【Tool】OpenCV API Learning I_第25张图片
55hXyE.png
  • write
    bool cv::imwrite(const string& filename, cv::InputArray image, const vector& params, = vector());

  • encode

void cv::imencode(const string& ext, cv::InputArray img, vector& buf, const vector& params, = vector());
  • decode
    cv::Mat cv::imdecode(cv::InputArray buf, int flags = cv::IMREAD_COLOR)

working with video

  • read video
cv::videoCapture::VideoCapture(const string& filename);
cv::videoCapture::VideoCapture(int device);
cv::videoCapture::VideoCapture();
  • read frames
bool cv::VideoCapture::read(cv::OutputArray image);

cv::VideoCapture& cv::VideoCapture::operator>>(cv::Mat& image);
bool cv::VideoCapture::grab(void);

bool cv::VideoCapture::retrieve(cv::OutputArray image, int channel=0);
double cv::VideoCapture::get(int propid);

bool cv::VideoCapture::set(int propid, doubel value);
【Tool】OpenCV API Learning I_第26张图片
55hQwS.png

【Tool】OpenCV API Learning I_第27张图片
55hdGh.png
  • write video
cv::VideoWriter::VideoWriter(const string& filename, int forcc, double fps, cv::Size frame_size, bool is_color = true);

writer.open()
writer.write()
cv::VideoWriter::operator<<()

Data Persistence

Cross-Platform and Native Windows

HighGUI

点击,按键,滑动条

  • cv::namedWindow()
int cv::namedWindow(const string& name, int flags=0);
  • cv::destroyWindow()
int cv::destroyWindow(const string& name);
  • cv::imshow()

  • cv::waitKey()

  • void cv::moveWindow(const char*name, int x, in y);

  • void cv::destroyAllWindows(void);

  • void cv::startWindowThread(void);

  • mouse events

void your_mouse_callback(int event, int x, int y, int flags, void* param);
【Tool】OpenCV API Learning I_第28张图片
55hh3d.png

55hyLr.png

【Tool】OpenCV API Learning I_第29张图片
55hPRY.png
  • sliders, trackbars, and switches
int cv::createTrackbar(const string& trackbarName, const string& windowName, int* value, int count, cv::TrackbarCallback onChange=NULL, void* param=NULL);

HighGUI with QT-backend

int cv::displayOverlay(const string& name, const string& text, int delay);
int cv::dispplayStatusBar(const string& name, const string& text, int delay);

Filters and Convolution

border extrapolation and boundary conditions

  • cv::copyMakeBorder(): 图像操作的边缘填充

    • cv::BORDER_CONSTANT
    • cv::BORDER_WRAP
    • cv::BORDER_REPLITCATE
    • cv::BORDER_REFLECT_101
    • cv::BORDER_DEFAULT = cv::BORDER_REFLECT_101


      【Tool】OpenCV API Learning I_第30张图片
      5FHSxr.png
  • int cv::borderInterpolate(int p, int len, int borderType); 给定图像中一个点,求出距离该像素点位置偏移像素点的生成像素点, 一般在函数内部使用。

  • double cv::threshold()阈值化函数

double cv::threshold(
    cv::InputArray src,
    cv::OutputArray dst,
    double thresh,
    double maxValue,
    int thresholdType
);
【Tool】OpenCV API Learning I_第31张图片
5FH8rR.png
  • cv::adaptiveThreshold() 自适应阈值化, 只能处理单通道8-bit或者浮点图像,可以用来做图像分布,OCR识别等。
void cv::adaptiveThreshold(
    cv::InputArray src, 
    cv::InputArray dst,
    double maxValue,
    int adaptiveMethod,
    int thresholdType,
    int blockSize,
    double C
)
  • cv::blur() 均值平滑
void cv::blur(
    cv::InputArray src,
    cv::OutputArray dst, 
    cv::Size ksize,
    cv::Point anchor = cv::Point(-1,-1),
    int borderType = cv::BORDER_DEFAULT
)
  • cv::boxFilter() 更一般的均值平滑函数,可以指定输出数目,可以使用unmormalized模式(不除以kernel数目)。

  • cv::meadianBlur() 中值滤波
void cv::medianBlur(
    cv::InputArray src,
    cv::InputArray dst,
    cv::Size ksize
);
  • cv::GaussianBlur() 高斯滤波, opencv针对33,55, 7*7 sigmaX = 0的运算有特殊优化
void cv::GaussianBlur(
    cv::InputArray src,
    cv::OutputArray dst,
    cv::Size ksize, 
    double sigmaX,
    double sigmaY = 0.0,
    int borderType = cv::BORDER_DEFAULT
);

如果sigmaX, sigmaY都为0, 那么:

  • void cv::bilateralFilter() 双边滤波
void cv::bilateralFilter(
    cv::InputArray src,
    cv::OutputArray dst,
    int d, 
    double sigmaColor,
    double sigmaSpace,
    int borderType = cv::BORDER_DEFAULT
);
  • cv::Soble() soble 算子
void cv::Soble(
    cv::InputArray src,
    cv::Output dst,
    int ddepth,
    int xorder,
    int yorder,
    cv::Size ksize=3,
    doubel scale=1,
    double delta=0,
    int borderType=cv::BORDER_DEFAULT
);

特别的使用ksize=3的时候,一般都应该设置为cv::SCHARR。


【Tool】OpenCV API Learning I_第32张图片
5FHldd.png
  • cv::Laplacian() 拉普拉斯算子
void cv::Laplacian(
    cv::InputArray src,
    cv::OutputArray dst,
    int ddepth,
    cv::Size ksize=3,
    double scale = 1,
    double delta = 0,
    int borderType = cv::BORDER_DEFAULT
)

the opencv implementaion of the laplacian operators uses the sobel operators derectly in its computation.

Image Morphology

  • cv::dilate() 膨胀
void cv::dilate(
    cv::InputArray src,
    cv::OutputArray dst,
    cv::InputArray element, 
    cv::Point anchor = cv::Point(-1,-1),
    int iterations = 1,
    int borderType = cv::BORDER_CONSTANT,
    const cv::Scalar& borderValue = cv::morphologyDefaultBorderValue()
);
  • cv::erode() 腐蚀
void cv::erode(
    cv::InputArray src,
    cv::OutputArray dst,
    cv::InputArray element, 
    cv::Point anchor = cv::Point(-1,-1),
    int iterations = 1,
    int borderType = cv::BORDER_CONSTANT,
    const cv::Scalar& borderValue = cv::morphologyDefaultBorderValue()
);
  • cv::morphologyEx()可以用来进行多种形态学运算,开,闭,梯度,顶帽,黑帽。
void cv::morphologyEx(
    cv::InputArray src,
    cv::OutputArray dst,
    int op,
    cv::InputArray element, 
    cv::Point anchor,
    int iterations = 1,
    int borderType = cv::BORDER_DEFAULT,
    const cv::Scalar& borderValue = cv::morphologyDefaultBorderValue()
);
【Tool】OpenCV API Learning I_第33张图片
5FmCdB.png
  • cv::getStructuringElement() 形态学运算kernel形状
cv::Mat cv::getStructuringElement(
    int shape,
    cv::Size ksize,
    cv::Point anchor = cv::Point(-1,-1)
);
【Tool】OpenCV API Learning I_第34张图片
5FmcoJ.png
  • cv::filter2D() 提供kernel 进行一般卷积
cv::filter2D(
    cv::InputArray src,
    cv::InputArray dst,
    int ddepth,
    cv::InputArray kernel,
    cv::Point anchor = cv::Point(-1,-1),
    double delta = 0,
    int borderType = cv::BORDER_DEFAULT
);
  • cv::sepFilter2D() 可分解kernel的高效卷积函数,提供rowKernel和colKernel
cv::sepFilter2D(
    cv::InputArray src,
    cv::OutputArray dst,
    int ddepth,
    cv::InputArray rowKernel,
    cv::OutputArray columnKernel,
    cv::Point anchor = cv::Point(-1,1),
    double delta = 0,
    int borderType = cv::BORDER_DEFAULT
);
  • cv::getDerivKernel() 构建Sobel或者Scharr核
void cv::getDrivKernels(
    cv::OutputArray kx,
    cv::OutputArray ky,
    int dx,
    int dy,
    int ksize,
    bool normalize = true,
    int ktype = CV_32F //type for filter coefficients
);

  • cv::getGaussianKernel() 构建高斯kernel
cv::Mat cv::getGaussianKernel(
    int ksize,
    double sigma,
    int ktype = CV_32F
);

General Image Transform

  • cv::resize() 图像缩放,主要注意插值的方式
void cv::resize(
    cv::InputArray src,
    cv::OutputArray dst,
    cv::Size dsize,
    double fx,
    double fy,
    int interpolation = cv::INTER_LINEA
【Tool】OpenCV API Learning I_第35张图片
5FmEr6.png
  • cv::pyrDown() 下采样金字塔,主要注意如何提供dstsize
void cv::pyrDown(
    cv::InputArray src,
    cv::OutputArray dst,
    const cv::Size& dstsize = cv::size()
);
  • cv::buildPyramid(): 指定maxlevel金字塔数目构建图像金字塔。
void cv::buildPyramid(
    cv::InputArray src,
    cv::OutputArrayofArrays dst,
    int maxlevel
);
  • cv::pyUp(): 上采样金字塔
void cv::pyrUp(
    cv::InputArray src,
    cv::OutArray dst,
    const cv::Size& dstsize = cv::Size()
);
  • cv::warpAffine() 仿射变换
void cv::warpAffine(
    cv::InputArray src,
    cv::OutputArray dst,
    cv::InputArray M, // 2 by 3 transform mtx
    cv::Size dsize,
    int flags = cv::INTER_LINEAR,  // interpolation, inverse
    int borderMode = cv::BORDER_CONSTANT, // pixel extrapolation
    const cv::Scalar& borderValue = cv::Scalar() // for const borders
);
  • cv::getAffineTransform() 计算仿射变换矩阵
cv::Mat cv::getAffineTransform(
    const cv::Point2f* src,
    const cv::Point2f* dst
);
  • cv::getRotationMatrix2D() 计算旋转矩阵
cv::Mat cv::getRotationMatrix2D(
    cv::Point2f center,
    double angle,
    double scale
);

rotateMatrix计算公式:


【Tool】OpenCV API Learning I_第36张图片
5Fmsrd.png
  • cv::transform() 针对点的变换,最好使用transform而不是warpAffine()
void cv::transform(
    cv::InputArray src,
    cv::OutputArray dst,
    cv::InputArray mtx
);
  • cv::invertAffineTransform(): inverting an affine transformation
void cv::inverseAffineTransform(
    cv::InputArray M,
    cv::OutputArray iM
);
  • cv::warpPerspective() 透视变换
void cv::warpPerspective(
    cv::InputArray src,
    cv::OutputArray dst,
    cv::InputArray M,
    cv::Size dsize,
    int flags = cv::INTER_LINEAR,
    int borderMode = cv::BORDER_CONSTANT,
    const cv::Scalar& borderValue = cv::Scalar()
);
  • cv::Mat cv::getPerspectiveTransform() 计算透视变换矩阵
cv::Mat cv::getPerspectiveTransform(
    const cv::Point2f* src,
    const cv::Point2f* dst
);
  • cv::perspectiveTransform()
    perspective transform和affine区别:


    【Tool】OpenCV API Learning I_第37张图片
    5FmuiR.png
void cv::perspectiveTransform(
    cv::InputArray src,
    cv::OutputArray dst,
    cv::InputArray mtx
);

dst计算公式


5FmpWe.png
  • cv::cartToPolar()
void cv::cartToPolar(
    cv::InputArray x, 
    cv::InputArray y,
    cv::OutputArray magnitude,
    cv::OutputArray angle,
    bool angleInDegrees = false
);
  • cv::polarToCart
void cv::polarToCart(
    cv::InputArray magnitude,
    cv::InputArray angle,
    cv::OutputArray x,
    cv::OutputArray y,
    bool angleInDegrees = false
);
  • cv::logPolar() logPolar变换
void cv::logPolar(
    cv::InputArray src,
    cv::OutArray dst,
    cv::Point2f center,
    double m,
    int flags = cv::INTER_LINEAR | cv::WARP_FILL_OUTLIERS
);
  • void cv::remap()
void cv::remap(
    cv::InputArray src, 
    cv::OutputArray dst,
    cv::InputArray map1,
    cv::InputArray map2,
    int interpolation = cv::INTER_LINEAR,
    int borderMode = cv::BORDER_CONSTANT,
    const cv::Scalar& borderValue = cv::Scalar()
);
  • cv::inpaint() 图像修复函数
void cv::inpaint(
    cv::InputArray src,
    cv::InputArray inpaintMask,
    cv::OutputArray dst,
    double inpaintRadius,
    int flags
);
  • cv:: fastNLMeansDenoising() 只能处理CV::U8图像
    相似度对比公式:


    5FmGbA.png
void cv::fastNLMeansDenoising(
    cv::InputArray src,
    cv::OutputArray dst,
    float h = 3, // weight decay parameter
    int templateWindowSize = 7, //Size of patches used for comparison
    int searchWindowSize = 21m, // Maximum patch distance to consider
);
【Tool】OpenCV API Learning I_第38张图片
5FmMKO.png
  • cv::fastNlMeansDenoisingColored() 彩色图像专用函数
void cv::fastNlMeansDenoisingColored(
    cv::InputArray src,
    cv::InputArray dst,
    float h = 3, // luminosity weight decay parameter
    float hColor = 3, // color weight decay parameter 
    int templateWindowSize = 7,
    int searchWindowSize = 21 
);
【Tool】OpenCV API Learning I_第39张图片
5FmPpX.png
  • cv::fastNlMeansDesnoisingMulti()
void cv::fastNlMeansDesnoisingMulti(
    cv::InputArrayofArrays srcImgs,
    cv::OutputArray dst,
    int imgToDenoisingIndex, 
    int temporalWindowSize, // num images to use
    float h = 3,
    int templateWindowSize = 7,
    int searchWindowSize = 21
);
  • void cv::fastNlMeansDenoisingColoredMulti()
void cv::fastNlMeansDenoisingColoredMulti(
    cv::InputArrayofArrays srcImgs,
    cv::OutputArray dst,
    int imgToDenoiseIndex,
    int temporalWindowSize,
    float h = 3,
    float hColor = 3,
    int templateWindowSize=7,
    int searchWindowSize = 21
);
  • cv::equalizeHist() 只能处理单通道图像,对于彩色图像,通常会先转换到LAB空间,然后只在Luminosity通道进行直方图均衡化。
void cv::equalizeHist(
    const cv::InputArray src,
    cv::OutputArray dst
);

你可能感兴趣的:(【Tool】OpenCV API Learning I)