mat matsrc(psrcimg, false);//注意:當將引數copydata設為true後,則為深拷貝(複製整個影象資料)
iplimage-> mat
iplimage srcimg(matsrc);//此方法為淺拷貝
此方法會額外的建立乙個影象記憶體備份,而非引用。
matimg = matsrc.clone();
彩色影象rgb轉灰度公式:gray = r 0.299 + g 0.587 + b * 0.114。cv_bgr2gray為彩色轉灰度,cv_gray2bgr為灰度轉彩色。
mat matgray;
cvtcolor( matsrc , matgray, cv_bgr2gray );
flip(matsrc , matsrc , -1);
if (!matsrc.data)
if (matsrc.cols < 100 || matsrc.rows < 100)
腐蝕演算法使二值影象減小一圈 。原理:腐蝕替換當前畫素位畫素集合中找到的最小畫素值。ierode引數為腐蝕次數
for (int i = ierode; i > 0; i--)
膨脹演算法使二值影象減小一圈。原理:膨脹是替換當前畫素位畫素集合中找到的最大畫素值。 idilate引數為膨脹次數
for (int i = idilate; i > 0; i--)
線性平滑濾波,適用於消除高斯雜訊。(ismooth必須為單數)
if (ismooth % 2 == 0)
gaussianblur(matsrc, matsrc, size(ismooth, ismooth), 0);
非線性平滑技術,它將每一畫素點的灰度值設定為該點某鄰域視窗內的所有畫素點灰度值的中值。(ismooth必須為單數)
if (ismooth % 2 == 0)
medianblur (matsrc, matsrc, ismooth );
就是將影象上的畫素點的灰度值設定為0或255。ithreshold為二值化引數範圍(0~255)
threshold(matsrc, matsrc, ithreshold, ithreshold , thresh_binary);
otsu的中心思想是閾值t應使目標與背景兩類的類間方差最大。ithreshold為二值化引數範圍(0~255)
threshold(matsrc, matsrc, ithreshold , ithreshold , cv_thresh_otsu);
//建立輪廓
vectorvechierarchy;
vector> veccontours;
//尋找外輪廓
if( veccontours.empty() == 0 || vechierarchy.empty() == 0 )
rotatedrect box = minarearect(veccontours[1]);
point2f point[4];
box.points(point);
cv_filled為全部填充,如果需要填充某乙個輪廓填寫那個輪廓的id。
drawcontours(matsrc, veccontours , 0, scalar(255), cv_filled);
經典的canny邊緣檢測演算法通常都是從高斯模糊開始,到基於雙閾值實現邊緣連線結束。但是在實際工程應用中,考慮到輸入影象都是彩色影象,最終邊緣連線之後的影象要二值化輸出顯示,所以完整的canny邊緣檢測演算法實現步驟如下:1. 彩色影象轉換為灰度影象2. 對影象進行高斯模糊3. 計算影象梯度,根據梯度計算影象邊緣幅值與角度4. 非最大訊號壓制處理(邊緣細化)5. 雙閾值邊緣連線處理6. 二值化影象輸出結果
canny(matsrc ,matdes ,125, 350);
equalizehist(matsrc, matsrc);
void verticalprojection(const mat& src, mat& dst)
} }
void horizonprojection(const mat& src, mat& dst)
} }
vectorcircles;
houghcircles(matsrc, circles, cv_hough_gradient,
1, //累加器的解析度(影象的尺寸/2)
6, //兩個圓之間的最小距離
100, //canny高閾值
5, //最小投票數
3,7); //極小極大半徑3 10
vector::const_iterator itc = circles.begin();
while(itc != circles.end())
dcontrast為對比度引數,範圍為10-100,ibright為亮度引數範圍為0-255。
mattmp.convertto( matsrc, -1, dcontrast, ibright);
point1,point2為矩形對角的2個點。
rectangle(matsrc, point1, point2, scalar( 0, 0, 0), cv_filled, 0);
point1,point2為直線上的2個點。
line( matsrc , point1 , point2 , scalar( 0, 0, 0) );
circle( matsrc, point, 2, scalar(255,0,0,0), cv_filled, cv_aa, 0);
**:
OpenCV常用函式
直接訪問 效率高,但容易出錯 用指標直接訪問 在某些情況下簡單高效 image void operator iplimage img inline t operator const int rowindx typedef struct rgbpixel typedef struct rgbpixel...
OpenCV 常用函式
自動分配的緩衝區類,該類為函式和方法分配臨時緩衝區。如果乙個臨時的緩衝區通常是小 幾k的記憶體 但其大小取決於引數,在堆中建立乙個小的固定大小的陣列是有意義的。在opencv的core.hpp裡面有autobuffer 函式,該函式為自動分配一段指定大小的記憶體,並且可以指定記憶體中資料的型別。cv...
OPENCV常用函式
cv line mat img,point pt1,point pt2,const scalar color,int thickness 1,int linetype 8,int shift 0 opencv提供了line 函式來繪製直線,引數如下 img 要繪製線段的影象 pt1 線段的起點 pt...