opencv获取mat的指针_数字图像处理之opencv中Mat数据操作
數字圖像處理其實就是處理二維矩陣數據。利用opencv來學習處理算法是一種比較好的方式。學習opencv,主要就是調用其中的圖像處理函數來實現各種操作。如果要得到想要的處理結果,還需要對圖像處理算法有一定的了解。同時,可能也有自己想寫一些算法的沖動,并急切的想驗證自己寫的算法是否能夠滿足處理的要求。可是,真正到自己動手寫的時候,總發現無從下手,比如,想得到圖像中的ROI區域(感興趣區域),想對圖像做加減運算算,將兩幅圖像連接成一幅圖像等等。如果要想隨心所欲的按照自己的想法來操作一幅圖像,則需要對opencv的mat數據操作非常熟練,建議初學者將這些基本的操作背下來,然后你會發現,你再進行這樣的操作將是得心應手。
在opencv中對圖像數據進行操作,我們可以簡單的把mat數據看成一個二維數,里面存儲的就是圖像的數據,所以,對mat數組的操作就是在操作二維圖像數據。下面我們來實現常見的Mat數據操作。
首先,在c++中新建一個空的控制臺程序,然后,在屬性管理器中添加我們之前設置好的opencv4.0配置文件,回到解決方案界面,選擇源文件,右鍵添加新項目,然后得到一個空白的源文件,如圖1和圖2所示。
圖1添加配置好的opencv配置文件
圖2 添加空白的源文件
然后,就可以在這個空白的源文件中寫代碼了。下面用具體的代碼來說明怎么操作mat數據。下面的代碼都可以直接復制到自己的工程中直接運行如果涉及到要打開圖像文件的,直接替換代碼中的文件路徑為自己電腦中的圖像路徑就可以了。
int main(int argc, char** argv){//構造3X3的Mat矩陣// CV_8UC1和CV_8UC3是數據類型和通道,指8位無符號單通道和3數據,通道數據Mat a(Size(3,3),CV_8UC1);Mat b = Mat(Size(3,3),CV_8UC3);cout<圖3 輸出構造的mat數據
圖3是上面代碼輸出的結果,a是單通道,b是三通道,所以b是3行9列。里面的具體的值是opencv隨機自動給的,因為我們還沒有對mat賦值,這個不用管。再來看幾個操作,
Mat mz = Mat::zeros(Size(5,5),CV_8UC1);//構造5X5的全是0的mat數據
Mat mo = Mat::ones(Size(5,5),CV_8UC1);// 構造5X5的全是1的mat數據
Mat me = Mat::eye(Size(5,5),CV_8UC1); 構造5X5的單位矩陣的mat數據
上面的代碼可以直接在上面的main函數里面接著往下寫。圖4是輸出結果
圖4 上面三行代碼的輸出結果
接著往下寫。
Mat m1 = Mat::eye(Size(3,3),CV_32F);// CV_32F表示浮點數Mat m2 = Mat::ones(Size(3,3),CV_32F);Mat add = m1 + m2;//mat相加Mat sub = m1 –m2;//mat相減Mat mul1 = m1 * 2;//mat乘一個常數Mat mul2 = m1 + 2;//mat加一個常數Mat m1t = m1.t();//mat矩陣轉置Mat meInv = mul2.inv();//mat矩陣的逆矩陣int nonZeroNum = countNonZero(m1);//統計mat中非0的個數下面我們重新寫一個main函數,不自己構造mat數據,直接從圖像中得到。然后對圖像數據的mat進行操作
int main(int argc, char** argv){Mat src1 = imread("E:1.bmp", 0);//0表示單通道,1表示3通道Mat src2 = imread("E:2.bmp", 0);Mat absSub;absdiff(src1, src2, absSub);//兩圖相減的絕對值namedWindow("absSub",0);imshow("absSub", absSub);Mat roiMat = src1(Range(0,3),Range(0,4));//取圖像中的0到3行和0到4列cout<< roiMat <圖5 輸出結果顯示
上面包括了mat數據的主要操作命令,如果能夠把這些命令記住了,要對圖像做一般的操作基本上沒有什么問題了。
此外,如果要訪問圖像中的每一個像素值,可以采用下面指針的方式,速度是最快的。下面的代碼只是演示了怎么使用指針訪問像素,沒有什么特別的目的。
Mat dyImg = Mat(src1.rows, src1.cols,0);
for(int i=0;i
{
uchar* srcdata = src1.ptr(i);
uchar* dydata = dyImg.ptr(i);
for(int j=0;j< src1.cols;j++)
{
double tempValue = double(srcdata [j]) + 20.0;
if(tempValue < 0)
dydata[j] = 0;
else if(tempValue > 255)
dydata[j] = 255;
else
dydata[j] = tempValue;
}
}
namedWindow("dyImg ",0);
imshow("dyImg ", dyImg);
總結
以上是生活随笔為你收集整理的opencv获取mat的指针_数字图像处理之opencv中Mat数据操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android相关论文,android
- 下一篇: 锁的一些概念