【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 對小型數(shù)據(jù)比較高效盖文。
    常見的是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區(qū)別在于沟绪,通過成員變量訪問, 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兩個數(shù)據(jù)成員(第一個成員是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
    智能指針肿嘲,引用計數(shù)器迹缀。
    • addref(), release() 增加磷雇,減少引用計數(shù)器的數(shù)目。
    • empty(),查看引用指針指向的對象是否存在票腰。
    • delete_obj()
  • cv::Exception()
  • cv::DataType<> template
  • cv::InputArray cv::OutputArray cv::InputOutputArray

other utility functions

  • cv::alignPtr() 對齊指針
  • cv::alignSize()
  • cv::allocate() 類似C的對象數(shù)組指針
  • cv::fastAtan2()
  • cvCeil: 比x大的最小整數(shù)
  • cv::cubeRoot
  • cv::CV_Assert() cv::CV_DbgAssert()
  • cv::CV_Error() CV_ERROR_)_
  • cv:error()
  • cv::fastFree()
  • cv::fastMalloc()
  • cvFloor(): 比x小的最大整數(shù)
  • 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
  • 多維數(shù)組匣屡,指定維數(shù)和每一維度大小
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

防止數(shù)據(jù)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

可以簡化代碼:

// 不使用模板函數(shù)
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維向量的協(xié)方差
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 ,數(shù)據(jù)類型是浮點
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() 正態(tài)分布
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 畫圖函數(shù)一般都接受三個參數(shù) 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() 判斷線段是否在矩形內(nèi)

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() 默認隨機數(shù)生成器

cv::RNG()

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

cv::RNG::operator T() 生成特別類型的隨機數(shù)

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); 給定圖像中一個點嘱朽,求出距離該像素點位置偏移像素點的生成像素點旭贬, 一般在函數(shù)內(nèi)部使用怔接。

  • double cv::threshold()閾值化函數(shù)

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() 更一般的均值平滑函數(shù)岸军,可以指定輸出數(shù)目,可以使用unmormalized模式(不除以kernel數(shù)目)瓦侮。

  • cv::meadianBlur() 中值濾波
void cv::medianBlur(
    cv::InputArray src,
    cv::InputArray dst,
    cv::Size ksize
);
  • cv::GaussianBlur() 高斯濾波, opencv針對33,55, 7*7 sigmaX = 0的運算有特殊優(yōu)化
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()可以用來進行多種形態(tài)學運算肚吏,開方妖,閉,梯度罚攀,頂帽党觅,黑帽雌澄。
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() 形態(tài)學運算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的高效卷積函數(shù),提供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金字塔數(shù)目構建圖像金字塔。
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區(qū)別:


    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() 圖像修復函數(shù)
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() 彩色圖像專用函數(shù)
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
);
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市检疫,隨后出現(xiàn)的幾起案子宅粥,更是在濱河造成了極大的恐慌,老刑警劉巖电谣,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秽梅,死亡現(xiàn)場離奇詭異,居然都是意外死亡剿牺,警方通過查閱死者的電腦和手機企垦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晒来,“玉大人钞诡,你說我怎么就攤上這事∨缺溃” “怎么了荧降?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長攒读。 經(jīng)常有香客問我朵诫,道長,這世上最難降的妖魔是什么薄扁? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任剪返,我火速辦了婚禮,結果婚禮上邓梅,老公的妹妹穿的比我還像新娘脱盲。我一直安慰自己,他們只是感情好日缨,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布钱反。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪面哥。 梳的紋絲不亂的頭發(fā)上乙各,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音幢竹,去河邊找鬼耳峦。 笑死,一個胖子當著我的面吹牛焕毫,可吹牛的內(nèi)容都是我干的蹲坷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼邑飒,長吁一口氣:“原來是場噩夢啊……” “哼循签!你這毒婦竟也來了?” 一聲冷哼從身側響起疙咸,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤县匠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撒轮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乞旦,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年题山,在試婚紗的時候發(fā)現(xiàn)自己被綠了兰粉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡顶瞳,死狀恐怖玖姑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慨菱,我是刑警寧澤焰络,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站符喝,受9級特大地震影響闪彼,放射性物質發(fā)生泄漏。R本人自食惡果不足惜洲劣,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一备蚓、第九天 我趴在偏房一處隱蔽的房頂上張望课蔬。 院中可真熱鬧囱稽,春花似錦、人聲如沸二跋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扎即。三九已至吞获,卻和暖如春况凉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背各拷。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工刁绒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烤黍。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓知市,卻偏偏與公主長得像,于是被迫代替她去往敵國和親速蕊。 傳聞我的和親對象是個殘疾皇子嫂丙,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 前言opencv在圖像處理中使用廣泛,許多常見的應用場景例如人臉識別规哲,車牌識別等都是基于opencv開發(fā)的跟啤。本文是...
    肖丹晨閱讀 4,968評論 0 4
  • 濕潤之詩 天色陰郁,適合寫下濕潤的詞語 適合吹一吹山林的清風 麻雀們在枝葉間相擁取暖 老人劈柴唉锌、生火隅肥,喝下清晨的第...
    ATian阿天閱讀 240評論 1 3
  • ??突然間發(fā)現(xiàn)這個網(wǎng)站,可以下載很多kindle電子書袄简。觀摩了下武福,和前段時間剛寫的爬取頭條有點類似。??該網(wǎng)站鏈接...
    nobodyyang閱讀 7,576評論 8 3
  • 1:吊蘭:能吸收空氣中95%的一氧化碳和85%的甲醛 吊蘭能在微弱的光線下進行光合作用,吊蘭能吸收空氣中的有毒有害...
    kqmpjpjdmb閱讀 119評論 0 0
  • 整整29張圖片昂芜,可我一張都舍不得刪除莹规,每個美麗的瞬間都不想錯過! 雙十一泌神,沒有什么好禮物送給自己良漱,一場和海邊的約會...
    淡語52188閱讀 393評論 12 14