[英]OpenCV - Cropping non rectangular region from image using C++
裁剪圖像的任意四邊形(或任何多邊形)部分的過程總結為:
所以,假設你有一個圖像。 在整個過程中,為了簡單起見,我將使用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.