【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}


    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}


    55Y3Qh.png

    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


    55zAjS.png
  • cv::Scalar 类,本质是有四个元素的vector。继承自cv::Vec<double, 4>,通过下标访问。


    55zUAa.png
  • cv::Size, 实际上是cv::Size2i, 有width, height两个数据成员(第一个成员是width, 第二个是height)。如果要使用浮点坐标,cv::Size2f。

  • 55V65J.png

    55VA6l.png
  • cv::Rect, 有height, width, x, y四个成员。注意!Rect的x是横向坐标,y是纵向坐标(从构造器也可以看出)。


    55VqgS.png

    55VoUz.png
  • cv::RotatedRect,前面的是坐标轴对齐的矩形,这个是非坐标轴对齐的矩形。包含cv::Point2f的中心点,cv::Size2f是大小,float angle成员。

55VnOa.png
  • cv::complexf, cv::complexd


    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()


    55zKwz.png

    55zes2.png

large array types

cv::Mat 下一章讲

Dynamic and Variable Storage

cv::Mat constructor

default constructor

  • 指定row, column
  • 传入 cv::Size
  • 多维数组,指定维数和每一维度大小
55YmOq.png

cv::Mat copy constructor

55YHIA.png

cv::Mat template constructor

55YX9O.png

55YFZ9.png

static member functions

55YzUe.png

accessing array elements

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

NAryMatIterator()

Accessing Array Elements by Block

55YVnd.png

Matrix Expression

55Y0QR.png

55YQcr.png

Saturation Casting

防止数据overflow或者underflow

More Mat operations

55YjXi.png

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

55YhiK.png

template structure for large array types

可以简化代码:

// 不使用模板函数
cv::Mat m(10, 10, CV_32FC2);
m.at<Vec2f>(i0,i1) = cv::Vec2f(x,y);
// 使用模板
cv::Mat_<Vec2f> 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<cv::Mat>& 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<typename _Tp> _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<Mat>& 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<cv::Point>& 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);
55hXyE.png
  • write
    bool cv::imwrite(const string& filename, cv::InputArray image, const vector<int>& params, = vector<int>());

  • encode

void cv::imencode(const string& ext, cv::InputArray img, vector<uchar>& buf, const vector<int>& params, = vector<int>());
  • 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);
55hQwS.png

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);
55hh3d.png

55hyLr.png

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


      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
);
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, 那么:
\sigma_x = \frac{n_x - 1}{2}\cdot0.3 + 0.8, n_x= ksize\cdot width - 1
\sigma_y = \frac{n_y - 1}{2}\cdot0.3 + 0.8, n_x= ksize\cdot height- 1

  • 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。


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()
);
5FmCdB.png
  • cv::getStructuringElement() 形态学运算kernel形状
cv::Mat cv::getStructuringElement(
    int shape,
    cv::Size ksize,
    cv::Point anchor = cv::Point(-1,-1)
);
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
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计算公式:


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区别:


    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
);
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 
);
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
);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 前言opencv在图像处理中使用广泛,许多常见的应用场景例如人脸识别,车牌识别等都是基于opencv开发的。本文是...
    肖丹晨阅读 4,972评论 0 4
  • 湿润之诗 天色阴郁,适合写下湿润的词语 适合吹一吹山林的清风 麻雀们在枝叶间相拥取暖 老人劈柴、生火,喝下清晨的第...
    ATian阿天阅读 240评论 1 3
  •   突然间发现这个网站,可以下载很多kindle电子书。观摩了下,和前段时间刚写的爬取头条有点类似。  该网站链接...
    nobodyyang阅读 7,578评论 8 3
  • 1:吊兰:能吸收空气中95%的一氧化碳和85%的甲醛 吊兰能在微弱的光线下进行光合作用,吊兰能吸收空气中的有毒有害...
    kqmpjpjdmb阅读 119评论 0 0
  • 整整29张图片,可我一张都舍不得删除,每个美丽的瞬间都不想错过! 双十一,没有什么好礼物送给自己,一场和海边的约会...
    淡语52188阅读 393评论 12 14