Opencv學習筆記(二)

矩陣的掩膜操作
(一)
獲取圖像像素指針
Mat.ptr(int i = 0) 獲取像素矩陣的指針
Const uchar* current = myImage.ptr(row); 獲取當前行指針
(二)
像素範圍處理
saturate_cast(數字)
確保RGB值在0~255之間
(三)
在這裏插入圖片描述
(四)
函數調用filter2D功能
定義掩膜 : Mat kernel = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0)

filter2D (src,dst,src.depth(),kernel);
Src :原圖像
Dst :變化後圖像
Src.depth() : 位圖深度 有32,24,8等 。 可用-1代替表示和原圖一樣

(五)
測程序運行時間
double t = getTickCount();
– -----程序--------
double time = (getTickCount() - t) / getTickFrequency();
printf(“Time is %.6f”, time);

(代碼部分)

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;

int main(int argc, char** argv)
{
	Mat src, dst;
	src = imread("D:/picture/Curry.jpeg");
	if (!src.data)     //如果沒有找到圖片
	{
		printf("could not find picture.....\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);   
	imshow("input image", src); 
	/*
	int cols = (src.cols - 1) * src.channels();
	int offsets = src.channels();
	int rows = src.rows;

	dst = Mat::zeros(src.size(), src.type());   //     初始化dst  和src類型大小一樣
	for (int row = 1; row < (rows - 1); row++)
	{
		const uchar* previous = src.ptr<uchar>(row - 1);
		const uchar* current = src.ptr<uchar>(row);
		const uchar* next = src.ptr<uchar>(row + 1);
		uchar* output = dst.ptr<uchar>(row);
		for (int col = offsets; col < cols; col++)
		{
			output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsets] + current[col + offsets] + previous[col] + next[col]));
		}
	}
	*/
	double t = getTickCount();
	Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0,
	                               	 -1, 5, -1,
		                              0, -1, 0);
	filter2D(src, dst, src.depth(), kernel);
	double time = (getTickCount() - t) / getTickFrequency();
	printf("Time is %.6f", time);
	namedWindow("output Image", CV_WINDOW_AUTOSIZE);
	imshow("output Image", dst);

	waitKey(0);   //等待
	return 0;
}

沒有註釋部分爲直接用opencv封裝庫進行掩膜

實驗效果
在這裏插入圖片描述

發佈了12 篇原創文章 · 獲贊 10 · 訪問量 560
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章