天天看點

opencv筆記(矩陣Mat的常用操作)

最近将一個matlab中的程式用opencv實作

matlab中涉及到的許多矩陣操作 , 在opencv中對應Mat類的操作

下面是程式設計過程中用到的一些常用方法,記得比較雜

 CV_<bit_depth>(S|U|F)C<number_of_channels>

S = 符号整型  U = 無符号整型  F = 浮點型

可通過binImg.type() != CV_8UC1來檢視類型

圖像轉化為浮點型

img.convertTo(img,CV_32F);

轉成三通道

cvtColor(lineImage, lineImage, CV_GRAY2BGR); 

轉成單通道

cvtColor(input1, gray, CV_BGR2GRAY);

Mat::size[0]表示行數

size[1]表示列數

Mat構造函數的時候是矩陣的概念也是先行後列

隻有Size構造函數的時候是尺寸的概念是先 寬 後 高 Size(寬,高)  也就是先列後行

還有Point構造函數(x,y)的概念

對于點Point,的坐标x,y,原點在圖像的左上角

圖像的img.at<>(y,x)也是左上角為原點,注意是y,x 也就是第y行,第x列

構造一個矩陣 

Mat Vt = Mat::zeros( img.size[0], img.size[1] , CV_32FC1);//uchar是CV_8U   int是CV_32SC1

X = Mat(h,w,CV_32FC1,Scalar::all(0));

通路圖像某一像素

X.at<類型>(i,j)   類型若為3通道則為Vec3b,單通道圖中預設是uchar(是CV_8U)

要轉成float用img1.convertTo(img1,CV_32F);也可用(uchar)(i)轉成uchar

//提取eyemat的1-2行,3-4列  

    Mat submat=eyemat(Range(0,2),Range(2,4));  

//提取第一行

Mat row = fx.rowRange(0,1).clone();  

以上兩種中的數字可以了解為每行(列)的間隙的位置

Mat src = imread(“xx.jpg”);  

Mat srcROI = src(Rect(0,0,src.cols/2,src.rows/2));  

構造一個矩陣 

Mat a=(Mat_<float>(3,3)<<0,-1,0,

 -1,5,-1,

0,-1,0);

double  minVal , maxVal ;

int minIdx , maxIdx;

minMaxIdx(a,&minVal, &maxVal , &minIdx , &maxIdx);//不需要用NULL替代 如minMaxIdx(a,NULL, &maxVal , NULL , &maxIdx);

尋找最小值最大值及位置 &minIdx和&maxIdx必須是指向包含兩個以上元素的指針

Mat a=(Mat_<int>(3,3)<<0,-1,110,

 -1,5,44,

-100,-1,0);

Mat b = a.diag();//傳回 b = [0;

    5;

    0]

//翻轉(鏡像),dst是Mat,可用于矩陣和圖像

flip(dst, dst2, 1); // flip by y axis

flip(dst, dst3, 0); // flip by x axis

flip(dst, dst4, -1); // flip by both axises//先x 後y  就相當于旋轉180度

///用STL 的vector 取中值

vector< float > vect;

Mat a=(Mat_<float>(3,3)<<0,1,110,

 2,5,44,

-100,7,0);

for ( i = 0 ; i < a.size[0] ; i++)

{

for ( j  = 0 ; j < a.size[1] ;  j++)

{

if ( a.at<float>(i,j) > 0 )

vect.push_back(a.at<float>(i,j));

}

}

sort(vect.begin(), vect.end());

mid = vect[(int)vect.size()/2] ;

/求矩陣所有值的和

float b =sum(a)[0];//a是單通道Mat

//sum傳回的是一個Scalar,Vect4x類型,後面三個都是0,是以取[0] 

卷積濾波  filter2D說明是卷積   實際上是相關運算!

filter2D(srcimg,dstimg,img.depth(),kernel);

通道分離合并

vector<Mat> channels;

split(srcImage, channels);

Mat image0, image1, image2;

image0 = channels.at(0);

image1 = channels.at(1);

image2 = channels.at(2);

imshow("image0", image0);

imshow("image1", image1);

imshow("image2", image2);

merge(channels, dstImage);

imshow("dstImage", dstImage);

OPENCV的HSV中的H是到180,而PS中的H是到360,應該是1/2的關系

繼續閱讀