openCV学习教程(一):Mat类的使用
Opencv3-Study
- Opencv學(xué)習(xí)筆記(八) -- 圖像色彩空間轉(zhuǎn)換
- yuv422轉(zhuǎn)opencv mat顯示
- OpenCv2 學(xué)習(xí)筆記(1) Mat創(chuàng)建、復(fù)制、釋放
- OpenCv學(xué)習(xí)筆記(二)--Mat矩陣(圖像容器)的創(chuàng)建及CV_8UC1,CV_8UC2等參數(shù)詳解
- Mat的幾種初始化
- Mat類之選取圖像局部區(qū)域
- 畫矩形框(普通的與旋轉(zhuǎn)的矩形框)
- 繪制連續(xù)多個矩形:
- 捕獲右上角×按鈕關(guān)閉顯示窗口事件
- OpenCV 計算圖像的直方圖,平均灰度,灰度方差
- meanStdDev函數(shù)
- OpenCV常用庫函數(shù)
- 鼠標(biāo)操作
- setMouseCallback:
- 調(diào)試:
- 有未經(jīng)處理的異常: Microsoft C++ 異常: cv::Exception
Opencv學(xué)習(xí)筆記(八) – 圖像色彩空間轉(zhuǎn)換
https://blog.csdn.net/u014337397/article/details/80834689
yuv422轉(zhuǎn)opencv mat顯示
rgb轉(zhuǎn)成mat
Mat image(IMAGE_HEIGHT, IMAGE_WIDTH, CV_8UC3, buffer);//buffer為轉(zhuǎn)完的rgb數(shù)據(jù)
實例:
Mat depthout(cv::Size(3072, 2048), CV_8UC3, stConvertParam.pDstBuffer);OpenCv2 學(xué)習(xí)筆記(1) Mat創(chuàng)建、復(fù)制、釋放
原文鏈接:https://blog.csdn.net/wanggao_1990/article/details/53150926
OpenCv學(xué)習(xí)筆記(二)–Mat矩陣(圖像容器)的創(chuàng)建及CV_8UC1,CV_8UC2等參數(shù)詳解
https://blog.csdn.net/maweifei/article/details/51221259
Mat的幾種初始化
(1) Mat::Mat()
(2) Mat::Mat(int rows, int cols, int type)
(3) Mat::Mat(Size size, int type)
(4) Mat::Mat(int rows, int cols, int type, constScalar& s)
(5) Mat::Mat(Size size, int type, constScalar& s)
(6) Mat::Mat(const Mat& m)
(7) Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
(8) Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
(9) Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
(10) Mat::Mat(const Mat& m, const Rect& roi)
(11) Mat::Mat(const CvMat* m, bool copyData=false)
(12) Mat::Mat(const IplImage* img, bool copyData=false)
(13) template<typename T, int n> explicit Mat::Mat(const Vec<T, n>& vec, bool copyData=true)
(14) template<typename T, int m, int n> explicit Mat::Mat(const Matx<T, m, n>& vec, bool copyData=true)
(15) template explicit Mat::Mat(const vector& vec, bool copyData=false)
(16) Mat::Mat(const MatExpr& expr)
(17) Mat::Mat(int ndims, const int* sizes, int type)
(18) Mat::Mat(int ndims, const int* sizes, int type, constScalar& s)
(19) Mat::Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0)
(20) Mat::Mat(const Mat& m, const Range* ranges)
延伸:OpenCv學(xué)習(xí)筆記(二)–Mat矩陣(圖像容器)的創(chuàng)建及CV_8UC1,CV_8UC2等參數(shù)詳解
Mat類之選取圖像局部區(qū)域
https://blog.csdn.net/shenwanjiang111/article/details/54318958
Mat的一個構(gòu)造函數(shù) C++: Mat::Mat(int rows, int cols, int type, const Scalar& s) ,其中rows和cols是需要創(chuàng)建的矩陣的行數(shù)和列數(shù),type是Mat的數(shù)據(jù)類型,s是Scalar類型的矩陣初值。
畫矩形框(普通的與旋轉(zhuǎn)的矩形框)
https://blog.csdn.net/weixin_42755384/article/details/88561526
繪制連續(xù)多個矩形:
參考代碼:
#include <iostream> #include <opencv2/opencv.hpp>#include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/imgproc.hpp"//連續(xù)畫矩形框 using namespace cv; using namespace std; //去掉以上兩行代碼注釋之后就可以不用在下面的代碼中加上cv::和std:: //cv::為OpenCV的函數(shù)庫 //std::為C++的標(biāo)準(zhǔn)函數(shù)庫void OnMouseAction(int event, int x, int y, int flags, void *ustc); //鼠標(biāo)回調(diào)事件函數(shù) Rect rect,temp; Mat src, src1;void draw_rec(Mat str, Mat src1); void draw_rec1(Mat str, Mat src1); int static times; //記錄調(diào)用次數(shù) int DrawRect(); int rec_num;int main(int argc, char*argv[]) {//以下的方法如果想運行,直接把前頭的注釋去掉即可//運行代碼的時候請改掉filename里的地址//我的opencv是安裝在C盤目錄下//一些目錄地址請自行修改一下//DrawRect(); //在圖像上畫四邊形const char* filename = "E:\\projects\\darknet-master\\build\\darknet\\x64\\data\\voc\\VOCdevkit\\VOC2007\\JPEGImages\\img1.bmp";src = imread(filename);imshow("title", src);rec_num = 0;setMouseCallback("title", OnMouseAction, 0);waitKey(0);return 0; } //*******************************************************************// //鼠標(biāo)回調(diào)函數(shù)void OnMouseAction(int event, int x, int y, int flags, void *ustc) {times++;switch (event){//左鍵按下事件case EVENT_LBUTTONDOWN://左鍵按下 定義起始點rect.x = x;rect.y = y;rect.width = 1;rect.height = 1;cout << "觸發(fā)左鍵按下坐標(biāo)為" << x << "," << y << endl;break;//鼠標(biāo)移動事件case CV_EVENT_MOUSEMOVE://當(dāng)左鍵按下時根據(jù)左鍵起始點繪制生成的矩形if (flags&EVENT_FLAG_LBUTTON){rect = Rect(Point(rect.x, rect.y), Point(x, y));draw_rec1(src,src1); //鼠標(biāo)移動過程中顯示移動軌跡}break;//左鍵松開事件case CV_EVENT_LBUTTONUP:if (rect.width > 1 && rect.height > 1){draw_rec(src,src1);rec_num++;}cout << "觸發(fā)左鍵松開坐標(biāo)為" << x << "," << y << endl;cout << "選中區(qū)域個數(shù)為" << rec_num << endl;default:break;}//cout << "第 " << times << " 次回調(diào)鼠標(biāo)事件" << endl;//if (event == CV_EVENT_MOUSEMOVE)//{// cout << "觸發(fā)鼠標(biāo)移動事件" << endl;//}//if (event == CV_EVENT_LBUTTONDOWN)//{// cout << "觸發(fā)左鍵按下事件" << endl;//}//if (event == CV_EVENT_LBUTTONUP)//{// cout << "觸發(fā)左鍵抬起事件" << endl;//}//if (event == CV_EVENT_RBUTTONDOWN)//{// cout << "觸發(fā)右鍵按下事件" << endl;// DrawRect(); //在圖像上畫四邊形//}//if (event == CV_EVENT_RBUTTONUP)//{// cout << "觸發(fā)右鍵抬起事件" << endl;//}//if (event == CV_EVENT_LBUTTONDBLCLK)//{// cout << "觸發(fā)左鍵雙擊事件" << endl;//}//if (event == CV_EVENT_RBUTTONDBLCLK)//{// cout << "觸發(fā)右鍵雙擊事件" << endl;//} }void draw_rec(Mat src, Mat src1) {src.copyTo(src1);rectangle(src1, rect, Scalar(0, 0, 255));src1.copyTo(src);imshow("title", src1);}void draw_rec1(Mat src, Mat src1) {src.copyTo(src1);rectangle(src1, rect, Scalar(0, 0, 255));imshow("title", src1);}int DrawRect() {const char* filename = "E:\\projects\\darknet-master\\build\\darknet\\x64\\data\\voc\\VOCdevkit\\VOC2007\\JPEGImages\\img1.bmp";cv::Mat mat = cv::imread(filename);if (mat.empty()) {throw("Faild open file.");}cv::Point p0 = cv::Point(mat.cols / 8, mat.rows / 8);cv::Point p1 = cv::Point(mat.cols * 7 / 8, mat.rows * 7 / 8);//設(shè)定點的起始和終止坐標(biāo)rectangle(mat, p0, p1, cv::Scalar(0, 255, 0), 5, 8);//畫四邊形的函數(shù)//第一個參數(shù)為畫圖的目標(biāo)圖像//第二個參數(shù)為畫圖的起始坐標(biāo)//第三個參數(shù)為畫圖的終止坐標(biāo)//第四個參數(shù)為畫圖的顏色cv::Point p2 = cv::Point(mat.cols * 2 / 8, mat.rows * 2 / 8);cv::Point p3 = cv::Point(mat.cols * 6 / 8, mat.rows * 6 / 8);rectangle(mat, p2, p3, cv::Scalar(0, 255, 255), 2, 4);cv::imshow("mat", mat);//cv::imwrite("C:\\Code\\FirstOpenCVProgramming\\DrawRect.jpg", mat);cv::waitKey();return 0; }捕獲右上角×按鈕關(guān)閉顯示窗口事件
在顯示循環(huán)中加入代碼:
if(!cvGetWindowHandle("窗口名字")) {break;}OpenCV 計算圖像的直方圖,平均灰度,灰度方差
https://www.cnblogs.com/ybqjymy/p/13650613.html
meanStdDev函數(shù)
計算矩陣的均值和標(biāo)準(zhǔn)偏差。
C++:
void meanStdDev(InputArray src,OutputArray mean, OutputArray stddev, InputArray mask=noArray())
C:
void cvAvgSdv(constCvArr* arr, CvScalar* mean, CvScalar* std_dev, const CvArr* mask=NULL )
Python:
cv.AvgSdv(arr,mask=None) -> (mean, stdDev)
parameter:
src:輸入矩陣,這個矩陣應(yīng)該是1-4通道的,這可以將計算結(jié)果存在Scalar_ ‘s中
mean:輸出參數(shù),計算均值
stddev:輸出參數(shù),計算標(biāo)準(zhǔn)差
mask:可選參數(shù)
OpenCV常用庫函數(shù)
原文鏈接:https://blog.csdn.net/weixin_42029090/article/details/80618208
鼠標(biāo)操作
setMouseCallback:
https://blog.csdn.net/qq_29540745/article/details/52562101
void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)winname:窗口的名字onMouse:鼠標(biāo)響應(yīng)函數(shù),回調(diào)函數(shù)。指定窗口里每次鼠標(biāo)時間發(fā)生的時候,被調(diào)用的函數(shù)指針。 這個函數(shù)的原型應(yīng)該為void on_Mouse(int event, int x, int y, int flags, void* param);userdate:傳給回調(diào)函數(shù)的參數(shù)附常用的event:
#defineCV_EVENT_MOUSEMOVE
#defineCV_EVENT_LBUTTONDOWN
#defineCV_EVENT_RBUTTONDOWN
#defineCV_EVENT_LBUTTONUP
#defineCV_EVENT_RBUTTONUP
和標(biāo)志位flags有關(guān)的:
#defineCV_EVENT_FLAG_LBUTTON
注意: flags & CV_EVENT_FLAG_LBUTTON 的意思是 提取flags的CV_EVENT_FLAG_LBUTTON 標(biāo)志位,!()的意思是 標(biāo)志位無效
Opencv中setMouseCallback()創(chuàng)建了一個鼠標(biāo)回調(diào)函數(shù),每次在圖像上單擊鼠標(biāo)左鍵再抬起的過程,都會分3次調(diào)用鼠標(biāo)響應(yīng)函數(shù),并且響應(yīng)順序是:
1.左鍵單擊按下;
2.左鍵單擊抬起;
3.鼠標(biāo)指針位置移動(即使原地單擊,鼠標(biāo)位置并沒有移動);
調(diào)試:
有未經(jīng)處理的異常: Microsoft C++ 異常: cv::Exception
原因:內(nèi)存溢出,將路徑中斜杠改為“\”
總結(jié)
以上是生活随笔為你收集整理的openCV学习教程(一):Mat类的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++:MFC _cstring.h库常
- 下一篇: openCV实战(一):rectangl