最近将一個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的關系