双色球走势综合分布图:操作圖像?

輸入/輸出?

圖像?

河北快三遗漏分布图 www.ainysi.com.cn 從文件中讀入一副圖像:

Mat img = imread(filename)

如果你讀入一個jpg文件,缺省情況下將創建一個3通道圖像。如果你需要灰度(單通道)圖像,使用如下語句:

Mat img = imread(filename, 0);

將圖像保存到一個文件:

Mat img = imwrite(filename);

XML/YAML?

TBD

基本圖像操作?

獲取像素的亮度值?

要獲取像素的亮度值,你必須知道圖像的類型和通道的數目。如下例子展示了獲取單通道灰度圖(類型 8UC1)的(x, y)位置處的像素值:

Scalar intensity = img.at<uchar>(x, y);

intensity.val[0] 中保存從0到255的值。現在我們看一下3通道圖像如何獲取像素值,顏色順序為 BGRimread 返回的缺省順序):

Vec3b intensity = img.at<Vec3b>(x, y);
uchar blue = intensity.val[0];
uchar green = intensity.val[1];
uchar red = intensity.val[2];

你可以使用同樣的方法處理浮點圖像(例如通對一個3通道圖像進行Sobel運算得到的浮點圖像):

Vec3f intensity = img.at<Vec3f>(x, y);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];

同樣的方法也可用于像素值的修改:

img.at<uchar>(x, y) = 128;

一些OpenCV函數,例如calib3d??櫓械?projectPoints 函數,需要以 Mat 的格式輸入二維或者三維的點。這樣的矩陣必須有且僅有一列,這樣每行對應一個點,矩陣類型需要是32FC2或者32FC3。這樣的矩陣可以很容易的從 std::vector 轉換而來:

vector<Point2f> points;
//... fill the array
Mat pointsMat = Mat(points);

您也可以通過 Mat::at 方法來讀寫矩陣中的一個元素:

Point2f point = pointsMat.at<Point2f>(i, 0);

內存管理和參考計數(reference counting)?

Mat 內存儲了矩陣/圖像的屬性(行數,列數,數據類型等)以及一個指向數據的指針。因此幾個 Mat 實例可以指向同一個數據。 Mat 中還記錄了參考計數(reference count),這樣在 Mat 被釋放時就知道是否需要釋放數據。這兒是一個不需復制數據就創建兩個矩陣的例子:

std::vector<Point3f> points;
// .. fill the array
Mat pointsMat = Mat(points).reshape(1);

這樣我們得到了一個3列的32FC1矩陣,而不是1列的32FC3矩陣。 pointsMat 使用 points 的數據,且當它釋放時不會是否數據。在這個例子中,開發者需要知道 points 的生命比 pointsMat 長。如果我們需要復制數據,那么請使用 Mat::copyToMat::clone

Mat img = imread("image.jpg");
Mat img1 = img.clone();

在C API中,開發者必須實現創建輸出圖像然后再調用函數。與之相比不同的是C++ API支持空的 Mat 類型的輸出參數。C++ API會調用 Mat::create 創建結果矩陣。如果矩陣是空的,那將會申請數據空間;如果非空,且大小和類型符合要求,則該函數不做任何事情;如果大小或類型不符合要求,原來的數據會被釋放,然后申請新的數據空間。例如:

Mat img = imread("image.jpg");
Mat sobelx;
Sobel(img, sobelx, CV_32F, 1, 0);

底層操作?

為矩陣定義了一系列方便的操作符。我們可以將一個已經存在的灰度圖像 img 變成全黑色:

img = Scalar(0);

選擇感興趣區域:

Rect r(10, 10, 100, 100);
Mat smallImg = img(r);

Mat 轉為 C API 數據類型:

Mat img = imread("image.jpg");
IplImage img1 = img;
CvMat m = img;

注意此處無數據復制操作。

將彩色圖像轉為灰度圖像:

Mat img = imread("image.jpg"); // loading a 8UC3 image
Mat grey;
cvtColor(img, grey, CV_BGR2GRAY);

將圖像的類型從8UC1轉為32FC1:

src.convertTo(dst, CV_32F);

顯示圖像?

在算法開發過程中,查看算法的中間結果是非常有用的。OpenCV提供了方便查看圖像的方法。類型為 8U 的圖像可以使用如下方法顯示:

Mat img = imread("image.jpg");

namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image", img);
waitKey();

調用 waitKey() 會進入一個消息循環,來等待 image 窗口上的按鍵動作。 類型為 32F 的圖像需要轉為 8U 類型。如下:

Mat img = imread("image.jpg");
Mat grey;
cvtColor(img, grey, CV_BGR2GREY);

Mat sobelx;
Sobel(grey, sobelx, CV_32F, 1, 0);

double minVal, maxVal;
minMaxLoc(sobelx, &minVal, &maxVal); //find minimum and maximum intensities
Mat draw;
sobelx.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal);

namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image", draw);
waitKey();

翻譯?

于仕琪 //www.ainysi.com.cn