做網(wǎng)站需要多少資金如何建立個(gè)人網(wǎng)址
????????OpenCV涉及的常用數(shù)據(jù)類型除包含C++的基本數(shù)據(jù)類型,如:char、uchar,int、unsigned int,short 、long、float、double等數(shù)據(jù)類型外, 還包含Vec,Point、Scalar、Size、Rect、RotatedRect、Mat等類。C++中的基本數(shù)據(jù)類型不需再做說明下面重點(diǎn)介紹一下OpenCV中特有的與數(shù)據(jù)或數(shù)據(jù)處理相關(guān)的常用類。
Vec類
????????Vec類是表示固定長度向量的模板類。它與vector相似,如初始化,元素訪問等,與vector不同的是: 因Vec試固定長度向量模板類,在聲明實(shí)例化時(shí)對(duì)象時(shí),除指定類型外,還得指定長度,在聲明vector實(shí)例化對(duì)象時(shí),除需指定類型外,長度則不是必需的。另外,Vec對(duì)象除可以賦值運(yùn)算符外,Vec對(duì)象還可以直接參與“算術(shù)運(yùn)算”,而vector對(duì)象雖然可以使用賦值運(yùn)算符,但不能直接參與“算術(shù)運(yùn)算”。
????????OpenCV中已經(jīng)預(yù)定義了多個(gè)可以直接使用的Vec類型別名,如下:
????????typedef?Vec<?uchar, 2 >??cv::Vec2b
????????typedef?Vec<?uchar, 3 >??cv::Vec3b
????????typedef?Vec<?uchar, 4 >??cv::Vec4b
????????typedef?Vec< short, 2 >??cv::Vec2s
????????typedef?Vec< short, 3?>??cv::Vec3s
????????typedef?Vec< short, 4>??cv::Vec4s
????????typedef?Vec<?ushort, 2 >??cv::Vec2w
? ? ? ? typedef?Vec<?ushort, 3>??cv::Vec3w
? ? ? ??typedef?Vec<?ushort, 24>??cv::Vec4w
????????typedef?Vec< int, 2 >??cv::Vec2i
????????typedef?Vec< int, 3?>??cv::Vec3i
????????typedef?Vec< int, 4?>??cv::Vec4i
????????typedef?Vec< int, 6?>??cv::Vec6i
?????????typedef?Vec< int, 8>??cv::Vec8i
????????typedef?Vec< float, 2 >??cv::Vec2f
????????typedef?Vec< float, 3?>??cv::Vec3f
????????typedef?Vec< float, 4>??cv::Vec4f
????????typedef?Vec< float, 6?>??cv::Vec6f
????????typedef?Vec< double, 2 >???cv::Vec2d
????????typedef?Vec< double, 3>? ? ?cv::Vec3d
????????typedef?Vec< double, 4?>? ???cv::Vec4d
????????typedef?Vec< double, 6?>? ???cv::Vec6d
????????現(xiàn)在以實(shí)例演示一下Vector與Vec用法上的區(qū)別。下面程序,編譯是不會(huì)出錯(cuò)的。
如果修改一下,加入算術(shù)運(yùn)算代碼, 如下:
可以看出·還沒有編譯,就·有·錯(cuò)誤·提示·,說明vector對(duì)象·是不可以與常數(shù)相乘的。
Vec類型對(duì)象可以與標(biāo)量進(jìn)行乘除,下面的程序則可以通過編譯,不會(huì)報(bào)錯(cuò):
該程序試運(yùn)行,結(jié)果如下:
需注意的是,Vec對(duì)象的算術(shù)運(yùn)算并非真正數(shù)學(xué)上的算術(shù)運(yùn)算,只是重載了算術(shù)運(yùn)算符。Vec實(shí)例化對(duì)象可以被標(biāo)量乘或除,結(jié)果是Vec對(duì)象的每一個(gè)元素都被標(biāo)量乘或除。Vec對(duì)象可以做乘數(shù)、被乘數(shù)、被除數(shù),但不可做除數(shù)。下面是一個(gè)Vec與標(biāo)量乘、除的示例程序代碼:
試運(yùn)行,結(jié)果如下:
Vec對(duì)象間可以做“+”、“-”運(yùn)算,運(yùn)算的Vec對(duì)象的類型及長度須相同。下面是一個(gè)Vec對(duì)象“+”、“-”運(yùn)算的示例程序:
試運(yùn)行,結(jié)果如下:
Vec對(duì)象的乘積 Vec對(duì)象可以相乘,存在乘積、點(diǎn)積與叉積之分。Vec對(duì)象要進(jìn)行乘運(yùn)算也需類型與長度相同,不符合乘法交換律。下面是一個(gè)Vec對(duì)象相乘、點(diǎn)積、差積的示例程序:?
試運(yùn)行,結(jié)果如下:?
Point(點(diǎn))類
?????????Ponit類也是一個(gè)模版類.
? ? ? ? template<typename _Tp>
????????class cv::Point_< _Tp >
Template class for 2D points specified by its coordinates?x
?and?y
.
????????template<typename _Tp>
????????class cv::Point3_< _Tp >
Template class for 3D points specified by its coordinates?x
,?y
?and?z
.。
????????Point類與MFC中的CPoint類似,OpenCV的Point類可以看作是存放2個(gè)或3個(gè)int或float值的容器,Point包含的值即點(diǎn)的坐標(biāo)。點(diǎn)有二維點(diǎn)與三位點(diǎn),OpenCV中按數(shù)據(jù)Point類型不同及維度不同預(yù)定義了:Point、Point2d、Point2i,Point2f、Pointe3d、Point3i、Point3f。
????????typedef?Point_<int>?cv::Point2i
????????typedef?Point_<float>?cv::Point2f
????????typedef?Point_<double>?cv::Point2d
????????typedef?Point2i?cv::Point
? ? ? ? typedef?Point3_<double>?cv::Point3d
????????typedef?Point3_<float>?cv::Point3f
????????typedef?Point3_<int>?cv::Point3i
????????Point對(duì)象可以先聲明再賦值,也可用構(gòu)造函數(shù)構(gòu)造Point對(duì)象并初始化。Point 也可被標(biāo)量乘除、Point對(duì)象間也可加減、Point對(duì)象間也可求叉積、點(diǎn)積。下面以實(shí)例演示Point對(duì)象聲明、初始化、及其它運(yùn)算。下面是演示程序的代碼:
// OpenCVBaseData.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Point p1;p1.x = 100;p1.y = 100;Point p2(200, 100);Point2d p2d1(100,127);Point2d p2d2(10, 123);Point2i p2i1(500, 350);Point2i p2i2(00, 310);Point2f p2f1(13.5, 24.7);Point2f p2f2(350.0, 270.3);Point3d p3d1(15, 25, 35);Point3d p3d2(55, 85, 0);Point3i p3i1(351, 227, 158);Point3i p3i2(11, 127, 18);Point3f p3f1(153.5, 163.1, 191.9);Point3f p3f2(1003, 2465, 381);Point p3,p4;Point2d p2d3, p2d4;Point2i p2i3, p2i4;Point2f p2f3, p2f4;Point3d p3d3, p3d4;Point3i p3i3, p3i4;Point3f p3f3, p3f4;p3 = p1 + p2;cout << "p3:" << endl;cout << p3 << endl;p4 = p1 * 2;cout << "p4:" << endl;cout << p4 << endl;cout << p1.dot(p2) << endl;cout << p4.cross(p1) << endl;cout << p4.ddot(p2) << endl;p2d3 = p2d1 / 2;p2d4 = p2d1 - p2d2;cout << "p2d3:" << endl;cout << p2d3 << endl;cout << "p2d4:" << endl;cout << p2d4 << endl;cout << p2d4.ddot(p2d1) << endl;cout << p2d4.dot(p2d1) << endl;cout << p2d4.cross(p2d1) << endl;p2i3 = p2i1 / 2;p2i4 = p2i1 - p2i2;cout << "p2i3:" << endl;cout << p2i3 << endl;cout << "p2i4:" << endl;cout << p2i4 << endl;cout << p2i4.ddot(p2i1) << endl;cout << p2i4.dot(p2i1) << endl;cout << p2i4.cross(p2i1) << endl;p2f3 = p2i1 / 2;p2f4 = p2i1 - p2i2;cout << "p2f3:" << endl;cout << p2f3 << endl;cout << "p2f4:" << endl;cout << p2f4 << endl;cout << p2f4.ddot(p2f1) << endl;cout << p2f4.dot(p2f1) << endl;cout << p2f4.cross(p2f1) << endl;p3d3 = p3d1 / 2;p3d4 = p3d1 - p3d2;cout << "p3d3:" << endl;cout << p3d3 << endl;cout << "p3d4:" << endl;cout << p3d4 << endl;cout << p3d4.ddot(p3d1) << endl;cout << p3d4.dot(p3d1) << endl;cout << p3d4.cross(p3d1) << endl;p3i3 = p3i1 / 2;p3i4 = p3i1 - p3i2;cout << "p3i3:" << endl;cout << p3i3 << endl;cout << "p3i4:" << endl;cout << p3i4 << endl;cout << p3i4.ddot(p3i1) << endl;cout << p3i4.dot(p3i1) << endl;cout << p3i4.cross(p3i1) << endl;p3f3 = p3i1 / 2;p3f4 = p3i1 - p3i2;cout << "p3f3:" << endl;cout << p3f3 << endl;cout << "p3f4:" << endl;cout << p3f4 << endl;cout << p3f4.ddot(p3f1) << endl;cout << p3f4.dot(p3f1) << endl;cout << p3f4.cross(p3f1) << endl;waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
OpenCV的點(diǎn)對(duì)象加、減運(yùn)算需是相同類型及相同維度,而叉積與點(diǎn)積運(yùn)算,則需是相同維度的Point才能進(jìn)行。
Scalar(標(biāo)量)類
????????Scalar類(標(biāo)量類)實(shí)際上是一個(gè)四維雙精度向量類。Scalar的公有成員函數(shù)如下:
Scalar?()=default
Scalar?(double v0)
Scalar?(double v0, double v1, double v2=0, double v3=0)
const double &? operator[]?(int i) const
double & operator[]?(int i)
前三個(gè)為構(gòu)造函數(shù),后面兩個(gè)為[]操作符重載函數(shù)。
Scalar有一個(gè)靜態(tài)工有成員函數(shù),如下:
static?Scalar? all?(double v0)
Scalar有一個(gè)公有屬性,如下:
double val?[4] = {0}
下面以實(shí)例演示Scalar對(duì)象創(chuàng)建,及公有屬性的訪問等。示例程序的代碼如下:
// OpenCVBaseData.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Scalar s1= Scalar();Scalar s2;s1[0] = 125;s1[1] = 125;s1[2] = 125;s1[3] = 0;s2 = s1.all(111);cout << "s1; " << s1 << endl;cout << "s2; " << s2 << endl;Scalar s3(127.0);cout << "s3; " << s3 << endl;Scalar s4(120,255,110,0);cout << "s4; " << s4 << endl;double d1, d2;d1 = s4.val[0];d2 = s4[3];cout << "d1: " << d1 <<endl;cout << "d2: " << d2 << endl;waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
Size(尺寸)類?
????????Size類比較簡單,它有兩個(gè)公有屬性變量width、height。Size類重載了賦值操作符“=”。Size類的構(gòu)造函數(shù)如下:
?????? Size?()=default
?????? Size?(int _width, int _height)
?????? Size?(const?cv::Size?&other)
Size因數(shù)據(jù)類型不同又可細(xì)分為:Size2d,Size2i,Size2f。下面以實(shí)例演示Size對(duì)象聲明及初始化等操作。實(shí)例程序代碼如下:
// OpenCVBaseData.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Size s1 = Size();s1.width = 100;s1.height = 150;Size s2(110, 330);Size s3(s1);cout << "s1: " << s1 << endl;cout << "s2: " << s2 << endl;cout << "s3: " << s3 << endl;Size2d s2d1(100,200);Size2i s2i1(1000, 2000);Size2f s2f1(1.00, 2.00);cout << "s2d1: " << s2d1 << endl;cout << "s2i1: " << s2i1 << endl;cout << "s2f1: " << s2f1 << endl;waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
Rect(矩形)類?
Rect類中以矩形的左上角坐標(biāo)及矩形寬度與高度來定義一個(gè)矩形。Rect類共有4個(gè)公有屬性變量:int x,int y,int? _width, int? _height。Rect類重載了賦值操作符“=”。Rect類的構(gòu)造函數(shù)如下:
Rect?()=default
Rect?(int _x, int _y, int _width, int _height)
?????? Rect?(const?cv::Rect?&other)
?????? 因數(shù)據(jù)類型不同,同樣也有Rect2d,Rect2i,Rect2f。
可是用Point類的inside函數(shù)判定一個(gè)點(diǎn)是否在矩形內(nèi)。下面以實(shí)例演示,Rect類對(duì)象聲明、初始化等。示例程序的代碼如下:
// OpenCVBaseData.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Rect rec1(0, 0, 100, 100);Rect rec2(rec1);Rect rec3 = rec2;cout << "rec1: " << endl;cout << "x: " << rec1.x << " " << "y: " << rec1.y << " " << "width: " << rec1.width << " " << "height: " << rec1.height << endl;cout << "rec2: " << endl;cout << "x: " << rec2.x << " " << "y: " << rec2.y << " " << "width: " << rec2.width << " " << "height: " << rec2.height << endl;Rect2d rec2d1(0, 0, 233, 233);Rect2i rec2i1(0, 0, 500, 500);Rect2f rec2f1(0, 0, 235.1, 500.0);Point p1(50, 250);if (p1.inside(rec2d1))cout << "p1 is inisde of rec2d1 " << endl;elsecout << "p1 is not inisde of rec2d1 "<< endl;if (p1.inside(rec2i1))cout << "p1 is inisde of rec2i1 " << endl;elsecout << "p1 is not inisde of rec2i1 " << endl;if (p1.inside(rec2f1))cout << "p1 is inisde of rec2f1 " << endl;elsecout << "p1 is not inisde of rec2f1 " << endl;waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
????????Rect對(duì)象可以進(jìn)行“==”判定,“|”運(yùn)算、“&”運(yùn)算。下面以實(shí)例做演示,演示代碼如下:?
// OpenCVBaseData.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Rect rec1(0, 0, 300, 300);Rect rec2(100, 100, 500, 500);if (rec1 == rec2)cout << "rec1 equals rec2" << endl;elsecout << "rec1 does not equal rec2" << endl;Rect rec3 = rec1 & rec2;cout << rec3 << endl;Rect rec4 = rec1 | rec2;cout << rec4 << endl;waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
RotatedRect(旋轉(zhuǎn)矩形)類?
RotatedRect類與Rect類的不同點(diǎn)是,Rect類所表示的矩形是水平放置的,而RotatedRect類所表示的矩形則是以任意角度放置的,相當(dāng)于在Rect表示的矩形基礎(chǔ)上再旋轉(zhuǎn)一個(gè)角度。
RotatedRect類的公有成員函數(shù)有一下幾個(gè):
RotatedRect?()
RotatedRect?(const?Point2f?¢er, const?Size2f?&size, float?angle)
參數(shù):center 矩形的質(zhì)心,size 矩形的長寬尺寸,angle 旋轉(zhuǎn)角度(順時(shí)針方向旋轉(zhuǎn))
RotatedRect?(const?Point2f?&point1, const?Point2f?&point2, const?Point2f?&point3)
參數(shù): point1 矩形的第一個(gè)點(diǎn),point2 矩形的第二個(gè)點(diǎn),point3 矩形的第三個(gè)點(diǎn),
Rect boundingRect?() const
返回包含旋轉(zhuǎn)矩形對(duì)象所表示旋轉(zhuǎn)矩形的最小矩形,數(shù)據(jù)類型為int
Rect<float> boundingRect2f?() const
返回包含旋轉(zhuǎn)矩形對(duì)象所表示旋轉(zhuǎn)矩形的最小矩形,數(shù)據(jù)類型為float
void points?(Point2f?pts[]) const
用旋轉(zhuǎn)矩形對(duì)象所表示矩形的角點(diǎn)填充Point2f 點(diǎn)數(shù)組
void points?(std::vector<?Point2f?> &pts) const
用旋轉(zhuǎn)矩形對(duì)象所表示矩形的角點(diǎn)填充Point2f 點(diǎn)數(shù)組
RotatedRect類的公有屬性成員變量有一下幾個(gè):
float angle 旋轉(zhuǎn)角度,以度表示
Pointe2f center? 矩形的質(zhì)心
Size2f?? size??? 代表矩形長寬的尺寸
?????? 下面以實(shí)例演示RotatedRect對(duì)象構(gòu)造及其它成員函數(shù)的用法。示例代碼如下:
#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat background(600, 1200, CV_8UC3, Scalar(127, 127, 127));string vertex_names[4] = { "1","2","3","4" };Point2f vertices[4];RotatedRect rRect = RotatedRect(Point2f(600, 300), Size2f(100, 50), 30);rRect.points(vertices);for (size_t i = 0; i < 4; i++){line(background, vertices[i], vertices[(i + 1) % 4], Scalar(0, 0, 255), 1);putText(background, vertex_names[i], vertices[i], FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0));}//Rect rec = rRect.boundingRect();Rect2f rec = rRect.boundingRect2f();rectangle(background, rec, Scalar(255, 0, 0), 1, 8, 0);imshow("Image", background);RotatedRect rRect1(Point2f(100, 100), Point2f(400, 100), Point2f(400, 300));cout <<"rRect1 angle: "<< rRect1.angle << endl;cout << "rRect1 center: " << rRect1.center << endl;cout << "rRect1 size" << rRect1.size << endl;waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
Mat 類?
????????Mat類在前面的文章中已經(jīng)詳細(xì)介紹這里不再做說明。這里介紹一下Mat對(duì)象矩陣數(shù)據(jù)的位操作及矩陣運(yùn)算。假如一個(gè)Mat對(duì)象存儲(chǔ)了一副RGB圖像,如何獲取或改變圖像中某一像素的值呢?要做到這一點(diǎn)可以用以下幾種
????????1.?使用Mat類的成員函數(shù)at。
? ? ? ? 2,使用Mat內(nèi)部數(shù)據(jù)指針ptr。
? ? ? ? 3.?使用Mat的數(shù)據(jù)矩陣的數(shù)據(jù)指針data。
? ? ? ? 4. 使用迭代器
下面用一個(gè)實(shí)例來演示以上幾種Mat數(shù)據(jù)位操作方法。示例代碼如下:
// OpeCVSharp.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}cout <<"src.cols:" << src.cols << endl;cout << "src.rows:" << src.rows << endl;cout << "src channels:" << src.channels() << endl;cout << "src type:" << src.type() << endl;//獲取第0排0列像素BGR值uchar b = src.at<uchar>((0, 0), 0);uchar g = src.at<uchar>((0, 0), 1);uchar r = src.at<uchar>((0, 0), 2);cout << "BGR:" << (int)b << " " << (int)g << " " << (int)r << endl;uchar* puchar = src.ptr(0, 0);uchar b1 = puchar[0];uchar g1 = puchar[1];uchar r1 = puchar[2];cout << "BGR:" << (int)b1 << " " << (int)g1 << " " << (int)r1 << endl;uchar b2 = src.data[0];uchar g2 = src.data[1];uchar r2 = src.data[2];cout << "BGR:" << (int)b2 << " " << (int)g2 << " " << (int)r2 << endl;//改變第0排0列像素BGR值src.at<uchar>((0, 0), 0) = 0;src.at<uchar>((0, 0), 1) = 0;src.at<uchar>((0, 0), 1) = 255;/*puchar[0] = 0;puchar[0] = 1;puchar[0] = 255;*//*src.data[0] =0;src.data[1] = 0;src.data[2] =255;*///imshow("src", src);waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
Mat對(duì)象實(shí)質(zhì)上是數(shù)據(jù)矩陣,當(dāng)然可以進(jìn)行矩陣運(yùn)算。這里不做全面介紹,僅介紹兩個(gè)有趣的運(yùn)算,與常數(shù)相乘及與常數(shù)向加。
????????先用實(shí)例演示與常數(shù)相乘,示例代碼如下:
// OpeCVSharp.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}cout <<"src.cols:" << src.cols << endl;cout << "src.rows:" << src.rows << endl;cout << "src channels:" << src.channels() << endl;cout << "src type:" << src.type() << endl;imshow("src", src);src *= 1.5;imshow("src new", src);src *= 0.5;imshow("src new1", src);waitKey(0);return 0;
}
?試運(yùn)行,結(jié)果如下:
可以看出存有圖像的Mat對(duì)象乘以一個(gè)大于1的常數(shù)將使圖像變亮,乘以一個(gè)小于1的常數(shù)使圖像變暗。不難想象,該Mat對(duì)象除以一個(gè)常數(shù)將會(huì)發(fā)生什么現(xiàn)象。
? ? ? ? 再演示一下Mat對(duì)象加、減以一個(gè)常數(shù),示例代碼如下:
// OpeCVSharp.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}cout <<"src.cols:" << src.cols << endl;cout << "src.rows:" << src.rows << endl;cout << "src channels:" << src.channels() << endl;cout << "src type:" << src.type() << endl;imshow("src", src);src += 20;imshow("src new", src);src -= 40;imshow("src new1", src);waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
????????可以看出,加一個(gè)常數(shù)使圖像變得更藍(lán),減以一個(gè)常數(shù)使圖像變黃,說明加、減都作用在像素的B通道上。?上面是用彩色圖做演示,如果把彩色圖轉(zhuǎn)換成灰度圖結(jié)果又會(huì)如何呢?再用實(shí)例演示一下,下面是演示的示例代碼:
// OpeCVSharp.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}cout <<"src.cols:" << src.cols << endl;cout << "src.rows:" << src.rows << endl;cout << "src channels:" << src.channels() << endl;cout << "src type:" << src.type() << endl;// imshow("src", src);cvtColor(src, src, COLOR_BGR2GRAY);imshow("src", src);src += 60;imshow("src new", src);src -= 80;imshow("src new1", src);waitKey(0);return 0;
}
試運(yùn)行,結(jié)果如下:
可以看出,對(duì)含灰度圖的Mat對(duì)象加一個(gè)?正數(shù),圖像會(huì)變量,減一個(gè)正數(shù)圖像會(huì)變暗。
下面再演示一下使用迭代器是圖像變亮,示例代碼如下:
// OpeCVSharp.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}imshow("src", src);/*Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);filter2D(src, src, src.depth(), kernel);imshow("src new", src);*///讓圖像變亮MatIterator_<Vec3b> itstart = src.begin<Vec3b>();MatIterator_<Vec3b> itend = src.end<Vec3b>();int temp = src.rows * src.cols;for (; itstart != itend; itstart++){(*itstart)[0] = saturate_cast<uchar>((*itstart)[0] + 50);(*itstart)[1] = saturate_cast<uchar>((*itstart)[1] + 50);(*itstart)[2] = saturate_cast<uchar>((*itstart)[2] + 50);}imshow("src new", src);waitKey(0);return 0;
}
試運(yùn)行結(jié)果如下:
?
本文到此結(jié)束,示例是基于OpenCV4.8(opencv目錄位于d盤根目錄下)及VS2022。