OpenCV函數的學習(持續更新。。。)

一、OpenCV Mat
一邊做項目一邊在學習,學習到啥,就寫啥,慢慢更新。
1.(1)Mat數據類型指針ptr的使用

cv::Mat image = cv::Mat(400, 600, CV_8UC1); //寬400,長600 
uchar * data00 = image.ptr<uchar>(0); 	// 指向image第一行第一個元素的指針
uchar * data10 = image.ptr<uchar>(1); 	// 指向image第二行第一個元素的指針
uchar * data01 = image.ptr<uchar>(0)[1];  // 指向image第一行第二個元素的指針

(2)Mat數據類型指針at的使用,訪問矩陣元素
Mat::at(int i0, int i1)
2.讀取圖片

IplImage* src = cvLoadImage("/home/aibc/wallpaper/desktopwallpaper/001.jpg",1);
IplImage* img_rgb=cvLoadImage("/home/aibc/wallpaper/desktopwallpaper/001.jpg");
// flags = -1 --> decode ;flags = 0 --> garyImg ;flags = 1 --> RGBimg
Mat img = cv::imread("/home/aibc/Wen/yolo_uav/test2/data/t3/495.jpg", 0);

3.打印錯誤流

   if(img.empty())
    {
        fprintf(stderr,"can not load image\n");
        return -1;
    }

在這裏插入圖片描述
4.顯示圖片

cvNamedWindow("kernal",CV_WINDOW_AUTOSIZE);	//CV_WINDOW_AUTOSIZE窗口大小會自動調整以適應所顯示的圖像,並且不能手動改變窗口大小
resizeWindow("kernal", 640, 480);	// 圖片不會跟着縮放,只是顯示框變大
imshow("kernal",schmid);

圖片一起縮放的辦法:

cvNamedWindow("kernal",WINDOW_NORMAL);	//WINDOW_NORMAL用戶便可以改變窗口的大小(沒有限制)
resizeWindow("kernal", 640, 480);
imshow("kernal",schmid);

WINDOW_NORMAL設置了這個值,用戶便可以改變窗口的大小(沒有限制);
INDOW_AUTOSIZE如果設置了這個值,窗口大小會自動調整以適應所顯示的圖像,並且不能手動改變窗口大小;
WINDOW_OPENGL 如果設置了這個值的話,窗口創建的時候便會支持OpenGL。

5.Mat <–> IplImg的相互轉換

Mat -> IplImg

Mat img = cv::imread("/home/aibc/Wen/yolo_uav/test2/data/t3/495.jpg", 0);
IplImage *src;
* src = IplImage(img);
error:Segmentation fault (core dumped)

修正:
深拷貝

// Mat -> IplImag
IplImage imgTmp = bgrImg;
IplImage *src = cvCloneImage(&imgTmp);

淺拷貝

//注意:淺拷貝 - 同樣只是創建圖像頭,而沒有複製數據
Mat M;
IplImage img = M;
IplImage img = IplImage(M);

IplImg - > Mat

//使用Mat的構造函數:Mat::Mat(const IplImage* img, bool copyData=false);    默認情況下copyData爲false
IplImage* srcImg = cvLoadImage("Lena.jpg");

//注意:以下三種效果一致,均爲淺拷貝

Mat M(srcImg);
Mat M(srcImg, false);
Mat M = srcImg;

//注意:當將參數copyData設爲true後,則爲深拷貝(複製整個圖像數據)

Mat M(srcImg, true);

REF:https://www.cnblogs.com/Key-Ky/p/4150531.html

6.運算符
(.)點運算符:
下面的代碼把值 “zara” 賦給對象 emp 的 first_name 成員:strcpy(emp.first_name, “zara”);
(->)箭頭運算符:
如果 p_emp 是一個指針,指向類型爲 Employee 的對象,則要把值 “zara” 賦給對象 emp 的 first_name 成員,需要編寫如下代碼:strcpy(p_emp->first_name, “zara”);

7.*(指針),&(取地址),()(函數調用),->(成員訪問),,(逗號),
.:成員訪問運算符
., ->:成員指針訪問運算符
:::域運算符
sizeof:長度運算符
?::條件運算符
#: 預處理符號

8.虛函數 是在基類中使用關鍵字 virtual 聲明的函數。在派生類中重新定義基類中定義的虛函數時,會告訴編譯器不要靜態鏈接到該函數。
在程序中任意點可以根據所調用的對象類型來選擇調用的函數,這種操作被稱爲動態鏈接。
調用函數 area() 被編譯器設置爲基類中的版本,這就是所謂的靜態多態,或靜態鏈接。函數調用在程序執行前就準備好了

9.標準輸出流(cout): cout << "Value of str is : " << str << endl;
標準輸入流(cin) : cout << "請輸入您的名稱: ";
標準錯誤流(cerr): cerr << "Error message : " << str << endl;
標準日誌流(clog): clog << "Error message : " << str << endl;

10.文件和流 http://www.runoob.com/cplusplus/cpp-files-streams.html

11.strcmp:C/C++函數,比較兩個字符串
設這兩個字符串爲str1,str2, 若str1==str2,則返回零; 若str1 > str2,則返回正數; 若str1< str2,則返回負數。
特別注意:strcmp(const char s1,const char s2)這裏面只能比較字符串,即可用於比較兩個字符串常量,或比較數組和字符串常量,不能比較數字等其他形式的參數。
strncmp:
strncmp函數是指定比較size個字符。也就是說,如果字符串s1與s2的前size個字符相同,函數返回值爲0。此函數功能即比較字符串str1和str2的前maxlen個字符。如果前maxlen字節完全相等,返回值就=0;在前maxlen字節比較過程中,如果出現str1[n]與str2[n]不等,則依次比較str1和str2的前n位,設i(i< n)爲兩字符串首次的不同位,則返回(str1[i]-str2[i])。 提示:該函數區分大小寫。

*12.C 庫函數 void calloc(size_t nitems, size_t size) 分配所需的內存空間,並返回一個指向它的指針。malloc 和 calloc 之間的不同點是,malloc 不會設置內存爲零,而 calloc 會設置分配的內存爲零。
void *calloc(size_t nitems, size_t size) //nitems – 要被分配的元素個數。 size – 元素的大小。
返回值:該函數返回一個指針,指向已分配的內存。如果請求失敗,則返回 NULL。

13.fprintf函數
作用:格式化輸出到一個流/文件中;

7.cv2.VideoCapture(0)
(1)、cap = cv2.VideoCapture(0)
VideoCapture()中參數是0,表示打開筆記本的內置攝像頭,參數是視頻文件路徑則打開視頻,如cap = cv2.VideoCapture(“…/test.avi”)
(2)、ret,frame = cap.read()
cap.read()按幀讀取視頻,ret,frame是獲cap.read()方法的兩個返回值。其中ret是布爾值,如果讀取幀是正確的則返回True,如果文件讀取到結尾,它的返回值就爲False。frame就是每一幀的圖像,是個三維矩陣。
(3)、cv2.waitKey(1),waitKey()方法本身表示等待鍵盤輸入,
參數是1,表示延時1ms切換到下一幀圖像,對於視頻而言;
參數爲0,如cv2.waitKey(0)只顯示當前幀圖像,相當於視頻暫停,;
參數過大如cv2.waitKey(1000),會因爲延時過久而卡頓感覺到卡頓。
c得到的是鍵盤輸入的ASCII碼,esc鍵對應的ASCII碼是27,即當按esc鍵是if條件句成立
(4)、調用release()釋放攝像頭,調用destroyAllWindows()關閉所有圖像窗口。
8.cvtcolor()
該函數是一個顏色空間轉換函數,可以實現RGB顏色向HSV,HSI等顏色空間轉換。也可以轉換爲灰度圖。
void cv::cvtColor(cv::InputArray src, // 輸入圖
cv::OutputArray dst, // 輸出圖
int code, // 顏色映射類型,可以查表得到,有很多
int dstCn = 0 // 輸出的通道數 (0=‘automatic’),我們可以使用默認值,什麼都不寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章