(附代碼)學(xué)習(xí)Opencv不得不掌握的操作
點擊左上方藍(lán)字關(guān)注我們

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//這些方式都是自己擁有獨立的內(nèi)存空間
Mat img1(2, 2, CV_8UC3, Scalar(0, 0, 255));
cout << img1 << endl;
int sz[3] = { 2,2,2 };
Mat img2(3, sz, CV_8UC1, Scalar(0, 0, 0));
//cout << img2 << endl;
Mat img5;
img5.create(4, 4, CV_8UC3);
cout << img5 << endl;
Mat img6 = Mat::zeros(4, 4, CV_8UC3);
cout << img6 << endl;
Mat img7 = img6.clone();
cout << img7 << endl;
Mat img8;
img6.copyTo(img8);
cout << img8 << endl;
//下面都是淺拷貝,指針指向同一個實例
Mat img9 = img8;
Mat img10(img8);
waitKey(0);
return 0;
}兩種方法,全局固定閾值二值化和局部自適應(yīng)閾值二值化全局固定閾值很容易理解,就是對整幅圖像都是用一個統(tǒng)一的閾值來進(jìn)行二值化;局部自適應(yīng)閾值則是根據(jù)像素的鄰域塊的像素值分布來確定該像素位置上的二值化閾值。
#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat image = imread("lol1.jpg", CV_LOAD_IMAGE_GRAYSCALE); //注意了,必須是載入灰度圖
if (image.empty())
{
cout << "read image failure" << endl;
return -1;
}
// 全局二值化
int th = 100;
Mat global;
threshold(image, global, th, 255, CV_THRESH_BINARY_INV);
// 局部二值化
int blockSize = 25;
int constValue = 10;
Mat local;
adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);
imshow("全局二值化", global);
imshow("局部二值化", local);
waitKey(0);
return 0;
}原始圖

兩種二值化效果對比
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat SrcPic = imread("lena.jpg");
imshow("Src Pic", SrcPic);
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //getStructuringElement函數(shù)返回的是指定形狀和尺寸的結(jié)構(gòu)元素
Mat DstPic;
erode(SrcPic, DstPic, element); //腐蝕操作
imshow("腐蝕效果圖", DstPic);
waitKey();
return 0;
}運行效果

#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat SrcPic = imread("lena.jpg");
imshow("Src Pic", SrcPic);
Mat DstPic;
blur(SrcPic, DstPic, Size(7, 7));
imshow("均值模糊效果圖", DstPic);
waitKey();
return 0;
}運行效果

思路:將原始圖像轉(zhuǎn)化為灰度圖,用blur函數(shù)進(jìn)行圖像模糊以降噪,然后用canny函數(shù)進(jìn)行邊緣檢測。
#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat SrcPic = imread("lena.jpg");
imshow("Src Pic", SrcPic);
Mat DstPic, edge, grayImage;
//創(chuàng)建與src同類型和同大小的矩陣
DstPic.create(SrcPic.size(), SrcPic.type());
//將原始圖轉(zhuǎn)化為灰度圖
cvtColor(SrcPic, grayImage, COLOR_BGR2GRAY);
//先使用3*3內(nèi)核來降噪
blur(grayImage, edge, Size(3, 3));
//運行canny算子
Canny(edge, edge, 3, 9, 3);
imshow("邊緣提取效果", edge);
waitKey();
return 0;
}運行效果

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("lol1.jpg");
Mat dstImg;
cvtColor(img, dstImg,COLOR_BGR2GRAY);//從宏名字就可以知道,是彩色圖轉(zhuǎn)換到灰度圖
imshow("灰度圖", dstImg);
waitKey(0);
}灰度圖

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
//訪問每個像素,我喜歡使用指針的方式
int main()
{
Mat img = imread("lol1.jpg");
for (int i = 0; i < img.rows; i++)
{
uchar* data = img.ptr<uchar>(i); //獲取第i行地址
for (int j = 0; j < img.cols; j++)
{
printf("%d\n",data[j]);
}
}
waitKey(0);
}#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
//直方圖均衡化
int main()
{
Mat img = imread("lol3.jpg");
imshow("原始圖", img);
Mat dst;
cvtColor(img, img, CV_RGB2GRAY);
imshow("灰度圖", img);
equalizeHist(img, dst);
imshow("直方圖均衡化", dst);
waitKey(0);
}顯然均衡化后的圖片對比度變高了,變得更加明亮!

#include<opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
//常見數(shù)據(jù)結(jié)構(gòu)使用方法總結(jié)
int main()
{
//Mat的用法
Mat m1(2, 2, CV_8UC3, Scalar(0, 0, 255)); //其中的宏的解釋:CV_[位數(shù)][帶符號與否][類型前綴]C[通道數(shù)]
cout << m1 << endl;
//或者,利用IplImage指針來初始化,將IplImage*轉(zhuǎn)化為Mat
IplImage* image = cvLoadImage("lena.jpg");
Mat mat = cvarrToMat(image);
//Mat轉(zhuǎn)IplImage:
IplImage img = IplImage(mat);
//或者
Mat m2;
m2.create(4, 5, CV_8UC(2));
//點的表示:Point
Point p;
p.x = 1; //x坐標(biāo)
p.y = 1; //y坐標(biāo)
//或者
Point p2(1, 1);
//顏色的表示:Scalar(b,g,r);注意不是rgb,注意對應(yīng)關(guān)系
Scalar(1, 1, 1);
//尺寸的表示:Size
Size(5, 5);// 寬度和高度都是5
//矩形的表示:Rect,成員變量有x,y,width,height
Rect r1(0, 0, 100, 60);
Rect r2(10, 10, 100, 60);
Rect r3 = r1 | r2; //兩個矩形求交集
Rect r4 = r1 & r2; //兩個矩形求并集
waitKey(0);
}END
評論
圖片
表情
