目錄
一、opencv的前身後世
1、簡介
2、iplimage介紹
3、mat介紹
二、哈哈鏡介紹
1、原理
2、實現
3、凸透鏡演算法
4、凹透鏡演算法
因為要做乙個專案,為了實現他的趣味性,所以想應用影象處理做一些東西,在上次完成**化之後,又了解了哈哈鏡效果,想自己實現,從網上找了好多教程,都是以前的opencv版本的**,在opencv3.0及以上版本已經不支援使用了。
可能最新學習opencv的小夥伴不了解什麼是「以前的opencv版本」。所以我先簡單介紹一下。
opencv是乙個基於bsd許可(開源)發行的跨平台計算機視覺庫,可以執行在linux、windows、android和mac os作業系統上。它輕量級而且高效——由一系列 c 函式和少量 c++ 類構成,同時提供了python、ruby、matlab等語言的介面,實現了影象處理和計算機視覺方面的很多通用演算法。
opencv用c++語言編寫,它的主要介面也是c++語言,但是依然保留了大量的c語言介面。所有新的開發和演算法都是用c++介面。乙個使用cuda的gpu介面也於2023年9月開始實現。
其他的一些介紹就在這裡不多說了,大家在網上也能找到。我主要再說一下在前面我說到的以前的opencv版本和新版本的差別。這個差別不是opencv2.0,opencv2.3.4,opencv3.0.0,opencv3.1.0,opencv3.4.0等等這些版本之間的差別。大家會發現,大家現在在學習opencv時,建立影象,用的時c++語言中的mat類,最初的opencv是用c語言編寫的,c語言是沒有類的,那用c語言用的自然就是結構體。所以接下來我講一下opencv結構體的表示。
在opencv中iplimage是表示乙個影象的結構體,也是從opencv1.0到目前最為重要的乙個結構;在之前的影象表示用iplimage,而且之前的opencv是用c語言編寫的,提供的介面也是c語言介面;
英文注釋版結構體如下:
typedef struct _iplimage
iplimage;
中文注釋版結構體如下:
typedef struct _iplimage
iplimage;
iplimage結構體是整個opencv函式庫的基礎,在定義該結構變數時需要用到函式cvcreatimage,變數定義方法如下:
//定義乙個iplimage指標變數src,影象的大小是200×300,影象顏色深度8位,3通道影象。
iplimage* src = "/cvcreateimage"(cvsize(200, 300), ipl_depth_8u, 3);
//定義乙個iplimage指標變數src,影象的大小是200×300,影象顏色深度8位,單通道影象。
iplimage* src = "/cvcreateimage"(cvsize(200, 300), ipl_depth_8u, 1);
由於定義的src是乙個指標變數,所以通過src來呼叫函式時,採用的是指向的方式:
//下面是兩種影象資料訪問方式的例子:
//1.直接訪問 : (效率高, 但容易出錯)
// 對單通道位元組影象 :
iplimage* src = cvcreateimage(cvsize(640, 480), ipl_depth_8u, 1);
((uchar *)(src->imagedata + i*src->widthstep))[j] = 111;
// 對多通道位元組影象:
iplimage* src = cvcreateimage(cvsize(640, 480), ipl_depth_8u, 3);
((uchar *)(src->imagedata + i*src->widthstep))[j*src->nchannels + 0] = 111; // b
((uchar *)(src->imagedata + i*src->widthstep))[j*src->nchannels + 1] = 112; // g
((uchar *)(src->imagedata + i*src->widthstep))[j*src->nchannels + 2] = 113; // r
// 對多通道浮點影象:
iplimage* src = cvcreateimage(cvsize(640, 480), ipl_depth_32f, 3);
((float *)(src->imagedata + i*src->widthstep))[j*src->nchannels + 0] = 111; // b
((float *)(src->imagedata + i*src->widthstep))[j*src->nchannels + 1] = 112; // g
((float *)(src->imagedata + i*src->widthstep))[j*src->nchannels + 2] = 113; // r
//2.用指標直接訪問 : (在某些情況下簡單高效)
// 對單通道位元組影象 :
iplimage* src = cvcreateimage(cvsize(640, 480), ipl_depth_8u, 1);
int height = src->height;
int width = src->width;
int step = src->widthstep / sizeof(uchar);
uchar* data = (uchar *)src->imagedata;
data[i*step + j] = 111;
// 對多通道位元組影象:
iplimage* src = cvcreateimage(cvsize(640, 480), ipl_depth_8u, 3);
int height = src->height;
int width = src->width;
int step = src->widthstep / sizeof(uchar);
int channels = src->nchannels;
uchar* data = (uchar *)src->imagedata;
data[i*step + j*channels + k] = 111;
// 對多通道浮點影象(假設用4位元組調整) :
iplimage* src = cvcreateimage(cvsize(640, 480), ipl_depth_32f, 3);
int height = src->height;
int width = src->width;
int step = src->widthstep / sizeof(float);
int channels = src->nchannels;
float * data = (float *)src->imagedata;
data[i*step + j*channels + k] = 111;
具體介紹內容詳解我的:【opencv學習筆記】004之mat物件 。裡面有mat簡介,常用成員,建構函式以及三種影象型別格式的轉換。
哈哈鏡是表面凸凹不平的鏡面,反映人像及物件的扭曲面貌,令人發笑,故名叫哈哈鏡。哈哈鏡的原理是曲面鏡引起的不規則光線反射與聚焦,做成散亂的影像。鏡面扭曲的情況不同,成像的效果也會相異。 常見的變換效果有高矮胖瘦四種效果,鏡面材質有金屬哈哈鏡,玻璃哈哈鏡等。
對應到物理中,哈哈鏡其實是光的折射,可以理解為數學中的對映,不同的對映會有不同的效果,如線性對映會產生放大縮小的感覺,凸函式則會是凸透鏡,凹函式就是凹透鏡,原則上,不同的函式就不會產生不同的結果。
所以如果希望通過opencv來做哈哈鏡,就需要找到乙個對應的對映,讓影象的畫素扭曲,從而實現哈哈效果。在這裡,實現了放大鏡和縮小鏡。
videocapture capture;
capture.open(0);
獲取到每一幀的影象後,需要對影象做一定的處理,因為用了兩種方式做處理分別得到:放大鏡,縮小鏡。所以在處理之前加乙個整形變數,允許使用者輸入,自由選擇處理方式,為了防止使用者非法輸入,我設定迴圈做判斷。輸入合法後才允許執行下面的**。並通過switch語句設定兩種處理方式。**如下:
int mode = -1;//動畫處理模式
cout << "請輸入型別:";
cin >> mode;
while (mode<0 || mode >= 2)
switch (mode)
break;
case 1:
while (1)
break;
default:
break;
}
接下來就是最核心的演算法,即映**。
在前面我們說到,所謂哈哈鏡,就是影象畫素點位置的變化,所以我們要獲取到每個畫素點的畫素值,然後對畫素點做操作。
void magnifyglass(mat hahaframe,mat img)
} }}
void compressglass(mat hahaframe,mat img)
}}
基於python的opencv專案實戰P4
形態學 腐蝕操作import cv2 import matplotlib.pyplot as plt import numpy as np get ipython run line magic matplotlib inline 腐蝕dige img cv2.imread dige.png cv2....
實戰深度學習OpenCV(一) canny邊緣檢測
利用canny邊緣檢測,我們可以很好地得到哦乙個影象的輪廓,下面是基於c 的,這是我們通過這段 得到的結果 讀入一張 mat srcimage imread c users lenovo desktop namedwindow 青春 0 建立視窗 cvresizewindow 青春 333,500 ...
基於 OpenCV 的面部關鍵點檢測實戰
csdn 編者按 這篇文章概述了用於構建面部關鍵點檢測模型的技術,這些技術是udacity的ai nanodegree程式的一部分。作者 小白 責編 歐陽姝黎 概述 在udacity的aind的最終專案中,目標是建立乙個面部關鍵點檢測模型。然後將此模型整合到完整的流水線中,該流水線拍攝影象,識別影象...