2016年2月5日 星期五

在Linux上使用類似system("PAUSE")的方法

system("PAUSE");
上面的語法使用在windows上的功能,可以等待使用者按了任意Key再繼續動作

然而這段語法放在Linux上是沒有任何作用的,如果在Linux上想使用類似的功能請使用如下的語法,可以讓使用者按了Enter再繼續:

====================================================
#include <stdio.h>

#define PAUSE {printf("Press Enter key to continue..."); fgetc(stdin);}

int main()
{
    PAUSE
    return 0;
}
====================================================

以上紅字的部分,就是使用方法~

2016年2月4日 星期四

Opencv,Mat的研究:depth(), channels(), elemSize(), dims, step

今天稍為花了一點時間 研究了一下使用Mat讀進了一張圖之後以下這些參數與函式所代表的意義   ===> depth(), channels(), elemSize(), dims, step


假設我們現在使用了下面這行程式碼讀了一張  780x1040(寬x高),彩色的圖片
Mat img1 = imread(test.jpg, IMREAD_UNCHANGED);


img1.depth(): 

代表每個pixel的位元(bit)數,在opencv中的Mat.depth()中得到的是一個0~6的數字,分別代表不同的位數,enum{ CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6}; 0和1都代表8位, 2和3都代表16位, 4和5代表32位,6代表64位,test.jpg為CV_8U因此img1.depth()=0。

img1.channels(): 

代表每個pixel的通到個數,以test.jpg為例為彩色的RGB圖,因此                                                   img1.channels()=3。

img1.elemSize(): 

img1.elemSize() = 3 (每一個元素包含3個uchar值), img1.elemSize1() = 1 (elemSize/channels); 矩陣中每一個元素的數據大小,如果Mat中的數據類型是CV_8U,則elemSize=1,若是CV_8UC3則elemSize=3,若是CV_16UC2則eleSize=4。

img1.dims: 

這張圖片的維度,以這張圖為例,寬x高是二為陣列的資料,所以img1.dims=2。

img1.step: 

step這個部分有兩個值可以取,第一個是img1.step[0],另一個是img1.step[1]。 img1.step[0]代表一列所有的數據大小,而img1.step[1]代表一個pixel的數據大小,所以img1.step[0]=img1 .cols * img1 .elemSize() = ˙780*3 = 2340,img1.step[1]=3,另外如果看到(int)img1.step這樣的寫法,也就是取img1.step[0]的意思。



以上~