簡體   English   中英

OpenCV - 使用C ++從圖像中裁剪非矩形區域

[英]OpenCV - Cropping non rectangular region from image using C++

如何從圖像中裁剪非矩形區域?

想象一下,我有四個點,我想裁剪它,這個形狀不會是一個三角形!

例如,我有以下圖像:

在此輸入圖像描述

我想從圖像中裁剪出來:

在此輸入圖像描述

我怎樣才能做到這一點? 問候..

裁剪圖像的任意四邊形(或任何多邊形)部分的過程總結為:

  • 生成“面具”。 面具是黑色的,你想要保留圖像,而白色則是你不想保留它的地方
  • 計算輸入圖像和蒙版之間的“bitwise_and”

所以,假設你有一個圖像。 在整個過程中,為了簡單起見,我將使用30x30的圖像大小,您可以根據自己的使用情況進行更改。

cv::Mat source_image = cv::imread("filename.txt");

你有4個點想要用作角落:

cv::Point corners[1][4];
corners[0][0] = Point( 10, 10 );
corners[0][1] = Point( 20, 20 );
corners[0][2] = Point( 30, 10 );
corners[0][3] = Point( 20, 10 );
const Point* corner_list[1] = { corners[0] };

您可以使用函數cv::fillPoly在蒙版上繪制此形狀:

int num_points = 4;
int num_polygons = 1;
int line_type = 8;
cv::Mat mask(30,30,CV_8UC3, cv::Scalar(0,0,0));
cv::fillPoly( mask, corner_list, &num_points, num_polygons, cv::Scalar( 255, 255, 255 ),  line_type);

然后簡單地計算圖像的bitwise_and和掩碼:

cv::Mat result;
cv::bitwise_and(source_image, mask, result);

result現在有裁剪的圖像。 如果你想讓邊緣最終變成白色而不是黑色,你可以改為:

cv::Mat result_white(30,30,CV_8UC3, cv::Scalar(255,255,255));
cv::bitwise_and(source_image, mask, result_white, mask);

在這種情況下,我們使用bitwise_and的mask參數來僅執行掩碼內的bitwise_and。 有關我提到的所有功能的更多信息和鏈接,請參閱本教程

您可以像這樣使用cv :: Mat :: copyTo():

cv::Mat img = cv::imread("image.jpeg");
// note mask may be single channel, even if img is multichannel
cv::Mat mask = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
// fill mask with nonzero values, e.g. as Tim suggests
// cv::fillPoly(...)
cv::Mat result(img.size(), img.type(), cv::Scalar(255, 255, 255));
img.copyTo(result, mask);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM