當前位置:首頁 » 編程語言 » opencvpython矩形

opencvpython矩形

發布時間: 2022-10-09 06:50:32

⑴ 我想要在opencv中用最小矩形外接圖中圖像並剪切截取出這個矩形部分。

試試 裡面一些參數要改一下 這是c++

vector<vector<Point>> vecContour;
vector<Vec4i> hierarcy;
findContours(dst1, vecContour, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);//查找輪廓
Rect boundRect;//存放外接矩形
RotatedRect rorect;//存放最小外接矩形
Point2f rect[4];
//vector<vector<Point>>proRect;
//Mat imageContours = Mat::zeros(image.size(), CV_8UC1);
for (int i = 0; i < vecContour.size(); i++)
{
boundRect = boundingRect(Mat(vecContour[i]));

if (boundRect.width < 200 || boundRect.height < 200)
continue;
circle(dst1, Point(rorect.center.x, rorect.center.y), 5, Scalar(0, 255, 0), -1, 8); //繪制最小外接矩形的中心點
rorect.points(rect); //把最小外接矩形四個端點復制給rect數組

rectangle(dst1, Point(boundRect.x, boundRect.y), Point(boundRect.x + boundRect.width, boundRect.y + boundRect.height), Scalar(0, 255, 0), 2, 8);
for (int j = 0; j < 4; j++)
{
line(dst1, rect[j], rect[(j + 1) % 4], Scalar(255, 0, 0), 2, 8); //繪制最小外接矩形每條邊
}

}

⑵ 基於python語言的opencv如何把圖片中指定區域截取出來

3-切割輪廓

(這是我網站找的一篇 blog, 親測有效)

⑶ OpenCV載入圖片指定(圓一個坐標,矩形兩個坐標)坐標畫圓(或者矩形)

ctrl+1 不知道你是不是指的這個,但是個人比較習慣用這個查看圖形的特性。圖層、顏色、線型、長度、起始點的坐標、面積等等都能夠查看的。

⑷ OpenCV-Python教程:19.輪廓屬性

1圖像矩

幫你計算一些屬性,比如重心,面積等。

函數cv2.moments()會給你一個字典,包含所有矩值

你可以從這個裡面得到有用的數據比如面積,重心等。重心可以用下面的式子得到:

2.輪廓面積

輪廓面積由函數cv2.contourArea()得到或者從矩里得到M['m00']

3.輪廓周長

可以用cv2.arcLength()函數得到。第二個參數指定形狀是否是閉合的輪廓(如果傳True)。或者只是一個曲線。

4.輪廓近似

這會把輪廓形狀近似成別的邊數少的形狀,邊數由我們指定的精確度決定。這是Douglas-Peucker演算法的實現。

要理解這個,假設你試圖找一個圖像里的方塊,但是由於圖像里的一些問題,你得不到一個完美的方塊,只能得到一個「壞方塊」。現在你可以使用這個函數來近似,第二個參數叫epsilon,是從輪廓到近似輪廓的最大距離。是一個准確率參數,好的epsilon的選擇可以得到正確的輸出。

在下面第二個圖像里,綠線顯示了epsilon = 10% of arc length 的近似曲線。第三個圖像顯示了epsilon = 1% of the arc length。第三個參數指定曲線是否閉合。

5.凸形外殼

凸形外殼和輪廓近似類似,但是還不一樣(某些情況下兩個甚至提供了同樣的結果)。這兒,cv2.convexHull()函數檢查凸面曲線缺陷並修復它。一般來說,凸面曲線總是外凸的,至少是平的,如果它內凹了,這就叫凸面缺陷。比如下面這張圖,紅線顯示了手的凸形外殼。雙向箭頭顯示了凸面缺陷,是輪廓外殼的最大偏差。

參數詳情:

·points 是我們傳入的輪廓
·hull 是輸出,一般我們不用傳
·clockwise: 方向標示,如果是True,輸出凸形外殼是順時針方向的。否則,是逆時針的。
·returnPoints:默認是True。然後會返回外殼的點的坐標。如果為False,它會返回輪廓對應外殼點的索引。

所以要獲得凸形外殼,下面

但是如果你想找到凸面缺陷,你需要傳入returnPoints = False。我們拿上面的矩形圖形來說,首先我找到他的輪廓cnt,現在用returnPoints = True來找他的凸形外殼,我得到下面的值:[[[234 202]], [[51 202]], [51 79]], [[234 79]]]  是四個角的點。如果你用returnPoints = False,我會得到下面的結果:[[129], [67], [0], [142]].  這是輪廓里對應點的索引,比如cnt[129] = [234, 202]],這和前面結果一樣。

6.檢查凸面

有一個函數用來檢查是否曲線是凸面, cv2.isContourConvex().它返回True或False。

7.邊界矩形

有兩種邊界矩形

7.a.正邊界矩形

這個矩形不考慮對象的旋轉,所以邊界矩形的面積不是最小的,函數是cv2.boundingRect()。

假設矩形左上角的坐標是(x,y), (w, h)是它的寬和高

7.b.渲染矩形

這個邊界矩形是用最小面積畫出來的,所以要考慮旋轉。函數是cv2.minAreaRect()。它返回一個Box2D結構,包含了(左上角(x,y),(width, height),旋轉角度)。但是要畫這個矩形我們需要4個角。這四個角用函數cv2.boxPoints()得到

8.最小閉包圓

我們找一個目標的外接圓可以用函數cv2.minEnclosingCircle().這個圓用最小面積完全包圍目標。

9.橢圓

用一個橢圓來匹配目標。它返回一個旋轉了的矩形的內接橢圓

10. 直線

類似的我們可以匹配一根直線,下面的圖像包含一系列的白色點,我們可以給它一條近似的直線。

END

⑸ Python怎麼在一幅圖像上畫矩形啊,不調用opencv。

import cv2 #導入opencv模塊
importnumpy asnp #導入numpy模塊並改名字為np方便調用

def salt(img, n): #定義函數,給圖像隨機加白點(輸入圖像,白點數)
for k in range(n): #從k=0到k=n,默認以步長1
i = int(np.random.random()* img.shape[1]); #產生隨機數(0~1)*圖像的寬
j = int(np.random.random() *img.shape[0]); #產生隨機數(0~1)*圖像的高
if img.ndim == 2: #如果圖像是二維的
img[j,i] = 255
elif img.ndim == 3: #如果圖像是三維的
img[j,i,0]= 255 #分別給三個通道的對應像素點賦值
img[j,i,1]= 255
img[j,i,2]= 255
return img #返回圖像,供顯示

if __name__ == '__main__':
img = cv2.imread("圖像路徑") #讀入圖像
saltImage = salt(img, 500) # 調用salt函數
cv2.imshow("Salt", saltImage) #顯示圖像
cv2.waitKey(0) #等待按鍵結束
cv2.destroyAllWindows() #銷毀窗口釋放內存

⑹ OpenCV Python實現旋轉矩形的裁剪

環境

矩形操作是我們在 OpenCV 里最常用的操作,其中最為常見的就是包圍框( Bounding Box )和旋轉矩形( Rotated Box )。 其中包圍框是最為常見的,對應 OpenCV 中的 boundingRect() ,使用正矩形框處物體,一般多用在目標檢測中。使用包圍框框柱目標物體,這種操作比較簡單,但是通常框中也會有一些其他的區域。其次就是使用旋轉矩形,也叫最小外接矩形,對應 OpenCV 中的 minAreaRect() ,用來使用旋轉矩形最大限度的框出目標物體,減小背景干擾,在 OCR 任務中較為常用。

minAreaRect() 返回了所需區域的最小斜矩形的參數,與包圍框直接返回四個頂點的坐標不同,最小外接矩形返回的是矩形的 ((x, y), (w, h), angle) ,對應了矩形的中心,寬度,高度和旋轉角度。

旋轉角度 angle 是水平軸( x 軸)逆時針旋轉,與碰到的矩形的第一條邊的夾角。並且這個邊的邊長是 width ,另一條邊邊長是 height 。也就是說,在這里 width 與 height 不是按照長短來定義的。

在 OpenCV 中,坐標系原點在左上角,相對於 x 軸,逆時針旋轉角度為負,順時針旋轉角度為正,所以函數 minAreaRect() 返回的角度范圍時 [-90~0) 。想像一個平放的長矩形,調用 minAreaRect() 返回的角度為 -90 度。如果我們旋轉圖像,直到矩形樹立起來,這是調用 minAreaRect() 得到的角度依然是 -90 度。

第一種裁剪旋轉矩形的方法是通過仿射變換旋轉圖像的方式。

仿射變換( Affine Transformation ) 是一種二維坐標到二維坐標之間的線性變換,保持二維圖形的「平直性」( straightness ,即變換後直線還是直線不會打彎,圓弧還是圓弧)和「平行性」( parallelness ,其實是指保二維圖形間的相對位置關系不變,平行線還是平行線,相交直線的交角不變。)。

計算過程:

如果不做邊長和角度的判斷,則只會沿著 x 軸的順時針方向做相同大小角度的旋轉,不能保證旋轉後的視角是正確的視角:

根據任務目標的類型,做邊長和角度的判斷並進行相應的調整,可以保證旋轉後的視角是正確的視角:

第二種裁剪旋轉矩形的方法是通過透視變換直接將旋轉矩形的四個頂點映射到正矩形的四個頂點。

透視變換( Perspective Transformation )是將圖片投影到一個新的視平面( Viewing Plane ),也稱作投影映射( Projective Mapping )。

計算過程:

以上兩種方法都可以用來摳取旋轉矩形的內容。仿射變換方法需要預先對整張圖進行旋轉,通過觀察旋轉後的圖像可以發現,有一部分圖像被旋轉出了圖像邊界,如果你要摳取的目標正好在圖像邊緣附近,那麼很容易出界導致圖像摳取的缺失。同時我們需要對寬、高和角度做出動態的調整;透視變換的方法直接對摳取區域進行了映射,這種方法可以省略旋轉的步驟,並且不會出現摳取內容的缺失。同時我們只需要對4個頂點之間的映射關系做好定義即可,不需要考慮角度的問題。相對的,透視變換相對於仿射變換計算量更大一些,不過這在 c++ 的底層實現上帶來的時延差距小於 ms 。

⑺ opencv python 用什麼語句判斷兩個灰度圖對應矩陣的值相同

看到一個別人的方法。
建議轉到HSV顏色空間,opencv 的H范圍是0~180,紅色的H范圍大概是(0~8)∪(160,180)
S是飽和度,一般是大於一個值,S過低就是灰色(參考值S>80),
V是亮度,過低就是黑色,過高就是白色(參考值220>V>50)。
判斷區域顏色是否相同,可以直接比較這兩個區域像素的HSV值。如果要完全相同,則各像素點的H,S,V的值都要一樣,否則可以有一定誤差范圍(具體是多少就只能自己估計了)。

熱點內容
linuxftp下載代碼 發布:2024-12-22 01:17:44 瀏覽:973
玩游戲平板安卓哪個性價比高 發布:2024-12-22 01:16:21 瀏覽:166
python查看類函數 發布:2024-12-22 01:15:31 瀏覽:41
詛咒密碼的第二塊碎片維內拉圖斯在哪裡 發布:2024-12-22 00:57:13 瀏覽:900
雲存儲伺服器管理系統 發布:2024-12-22 00:44:11 瀏覽:474
安卓系統推薦廣告怎麼關閉 發布:2024-12-22 00:42:50 瀏覽:863
蘋果ipad瀏覽器沒有伺服器怎麼辦 發布:2024-12-22 00:32:52 瀏覽:680
linux操作系統是什麼系統 發布:2024-12-22 00:30:46 瀏覽:89
linux密碼忘了怎麼辦 發布:2024-12-22 00:24:44 瀏覽:258
崩壞學園2金立伺服器是什麼 發布:2024-12-22 00:23:25 瀏覽:586