日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openCV学习教程(一):Mat类的使用

發布時間:2025/3/20 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openCV学习教程(一):Mat类的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Opencv3-Study

  • Opencv學習筆記(八) -- 圖像色彩空間轉換
  • yuv422轉opencv mat顯示
  • OpenCv2 學習筆記(1) Mat創建、復制、釋放
      • OpenCv學習筆記(二)--Mat矩陣(圖像容器)的創建及CV_8UC1,CV_8UC2等參數詳解
    • Mat的幾種初始化
    • Mat類之選取圖像局部區域
  • 畫矩形框(普通的與旋轉的矩形框)
    • 繪制連續多個矩形:
  • 捕獲右上角×按鈕關閉顯示窗口事件
  • OpenCV 計算圖像的直方圖,平均灰度,灰度方差
    • meanStdDev函數
  • OpenCV常用庫函數
  • 鼠標操作
    • setMouseCallback:
  • 調試:
    • 有未經處理的異常: Microsoft C++ 異常: cv::Exception

Opencv學習筆記(八) – 圖像色彩空間轉換

https://blog.csdn.net/u014337397/article/details/80834689

yuv422轉opencv mat顯示

rgb轉成mat
Mat image(IMAGE_HEIGHT, IMAGE_WIDTH, CV_8UC3, buffer);//buffer為轉完的rgb數據

實例:

Mat depthout(cv::Size(3072, 2048), CV_8UC3, stConvertParam.pDstBuffer);

OpenCv2 學習筆記(1) Mat創建、復制、釋放

原文鏈接:https://blog.csdn.net/wanggao_1990/article/details/53150926

OpenCv學習筆記(二)–Mat矩陣(圖像容器)的創建及CV_8UC1,CV_8UC2等參數詳解

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學習筆記(二)–Mat矩陣(圖像容器)的創建及CV_8UC1,CV_8UC2等參數詳解

Mat類之選取圖像局部區域

https://blog.csdn.net/shenwanjiang111/article/details/54318958
Mat的一個構造函數 C++: Mat::Mat(int rows, int cols, int type, const Scalar& s) ,其中rows和cols是需要創建的矩陣的行數和列數,type是Mat的數據類型,s是Scalar類型的矩陣初值。

畫矩形框(普通的與旋轉的矩形框)

https://blog.csdn.net/weixin_42755384/article/details/88561526

繪制連續多個矩形:

參考代碼:

#include <iostream> #include <opencv2/opencv.hpp>#include "core/core.hpp" #include "highgui/highgui.hpp" #include "imgproc/imgproc.hpp"//連續畫矩形框 using namespace cv; using namespace std; //去掉以上兩行代碼注釋之后就可以不用在下面的代碼中加上cv::和std:: //cv::為OpenCV的函數庫 //std::為C++的標準函數庫void OnMouseAction(int event, int x, int y, int flags, void *ustc); //鼠標回調事件函數 Rect rect,temp; Mat src, src1;void draw_rec(Mat str, Mat src1); void draw_rec1(Mat str, Mat src1); int static times; //記錄調用次數 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; } //*******************************************************************// //鼠標回調函數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 << "觸發左鍵按下坐標為" << x << "," << y << endl;break;//鼠標移動事件case CV_EVENT_MOUSEMOVE://當左鍵按下時根據左鍵起始點繪制生成的矩形if (flags&EVENT_FLAG_LBUTTON){rect = Rect(Point(rect.x, rect.y), Point(x, y));draw_rec1(src,src1); //鼠標移動過程中顯示移動軌跡}break;//左鍵松開事件case CV_EVENT_LBUTTONUP:if (rect.width > 1 && rect.height > 1){draw_rec(src,src1);rec_num++;}cout << "觸發左鍵松開坐標為" << x << "," << y << endl;cout << "選中區域個數為" << rec_num << endl;default:break;}//cout << "第 " << times << " 次回調鼠標事件" << endl;//if (event == CV_EVENT_MOUSEMOVE)//{// cout << "觸發鼠標移動事件" << endl;//}//if (event == CV_EVENT_LBUTTONDOWN)//{// cout << "觸發左鍵按下事件" << endl;//}//if (event == CV_EVENT_LBUTTONUP)//{// cout << "觸發左鍵抬起事件" << endl;//}//if (event == CV_EVENT_RBUTTONDOWN)//{// cout << "觸發右鍵按下事件" << endl;// DrawRect(); //在圖像上畫四邊形//}//if (event == CV_EVENT_RBUTTONUP)//{// cout << "觸發右鍵抬起事件" << endl;//}//if (event == CV_EVENT_LBUTTONDBLCLK)//{// cout << "觸發左鍵雙擊事件" << endl;//}//if (event == CV_EVENT_RBUTTONDBLCLK)//{// cout << "觸發右鍵雙擊事件" << 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);//設定點的起始和終止坐標rectangle(mat, p0, p1, cv::Scalar(0, 255, 0), 5, 8);//畫四邊形的函數//第一個參數為畫圖的目標圖像//第二個參數為畫圖的起始坐標//第三個參數為畫圖的終止坐標//第四個參數為畫圖的顏色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; }

捕獲右上角×按鈕關閉顯示窗口事件

在顯示循環中加入代碼:

if(!cvGetWindowHandle("窗口名字")) {break;}

OpenCV 計算圖像的直方圖,平均灰度,灰度方差

https://www.cnblogs.com/ybqjymy/p/13650613.html

meanStdDev函數

計算矩陣的均值和標準偏差。

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:輸入矩陣,這個矩陣應該是1-4通道的,這可以將計算結果存在Scalar_ ‘s中
mean:輸出參數,計算均值
stddev:輸出參數,計算標準差
mask:可選參數

OpenCV常用庫函數

原文鏈接:https://blog.csdn.net/weixin_42029090/article/details/80618208

鼠標操作

setMouseCallback:

https://blog.csdn.net/qq_29540745/article/details/52562101

void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)winname:窗口的名字onMouse:鼠標響應函數,回調函數。指定窗口里每次鼠標時間發生的時候,被調用的函數指針。 這個函數的原型應該為void on_Mouse(int event, int x, int y, int flags, void* param);userdate:傳給回調函數的參數

附常用的event:
#defineCV_EVENT_MOUSEMOVE
#defineCV_EVENT_LBUTTONDOWN
#defineCV_EVENT_RBUTTONDOWN
#defineCV_EVENT_LBUTTONUP
#defineCV_EVENT_RBUTTONUP

和標志位flags有關的:

#defineCV_EVENT_FLAG_LBUTTON
注意: flags & CV_EVENT_FLAG_LBUTTON 的意思是 提取flags的CV_EVENT_FLAG_LBUTTON 標志位,!()的意思是 標志位無效

Opencv中setMouseCallback()創建了一個鼠標回調函數,每次在圖像上單擊鼠標左鍵再抬起的過程,都會分3次調用鼠標響應函數,并且響應順序是:

1.左鍵單擊按下;
2.左鍵單擊抬起;
3.鼠標指針位置移動(即使原地單擊,鼠標位置并沒有移動);

調試:

有未經處理的異常: Microsoft C++ 異常: cv::Exception

原因:內存溢出,將路徑中斜杠改為“\”

總結

以上是生活随笔為你收集整理的openCV学习教程(一):Mat类的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。