opencv任意形状ROI

相关代码,比较简单,一看就懂:

	Mat srcImg = imread("lena.jpg");
	Mat dstImg;
	Mat mask = Mat::zeros(srcImg.size(),CV_8UC1);

	vector<vector<Point>> contour;
	vector<Point> pts;
	pts.push_back(Point(30,45));
	pts.push_back(Point(500,35));
	pts.push_back(Point(430,240));
	pts.push_back(Point(50,250));
	contour.push_back(pts);

	drawContours(mask,contour,0,Scalar::all(255),-1);
	srcImg.copyTo(dstImg,mask);

	imshow("src",srcImg);
	imshow("mask",mask);
	imshow("roi",dstImg);
	waitKey();


结果:


备注:如果是凸包轮廓,可用fillConvexPoly



C#中使用OpenCvSharp库截取图像的感兴趣区域(ROI),可以通过以下方法实现。OpenCvSharp 提供了灵活的方式来定义和提取图像中的特定区域,适用于矩形、圆形等多种形状ROI。 ### 1. 使用矩形ROI 对于矩形ROI,可以直接通过 `Rect` 类来定义区域,然后利用 `Mat` 构造函数或 `AdjustROI` 方法提取该区域。以下是具体代码示例: ```csharp using OpenCvSharp; class Program { static void Main(string[] args) { // 加载图像 Mat image = Cv2.ImRead("path_to_image.jpg"); // 定义矩形ROI的位置和大小 (x, y, width, height) Rect roiRect = new Rect(100, 100, 200, 150); // 截取ROI区域 Mat roi = new Mat(image, roiRect); // 保存ROI到文件 roi.ImWrite("path_to_roi.jpg"); // 显示原始图像和ROI Cv2.ImShow("Original Image", image); Cv2.ImShow("ROI", roi); Cv2.WaitKey(0); // 释放资源 image.Release(); roi.Release(); } } ``` ### 2. 使用多边形ROI并获取其边界矩形 如果需要处理非规则形状ROI(如斜矩形或多边形),可以先绘制多边形,然后使用 `BoundingRect` 方法获取其边界矩形进行截取[^2]。这种方法通常用于从用户交互或轮廓检测中获得的不规则区域。 ```csharp using OpenCvSharp; class Program { static void Main(string[] args) { // 加载图像 Mat image = Cv2.ImRead("path_to_image.jpg"); // 定义多边形的顶点 Point[] points = new Point[] { new Point(100, 100), new Point(300, 200), new Point(200, 400), new Point(50, 300) }; // 绘制多边形 Cv2.Polylines(image, new Point[][] { points }, true, Scalar.Red, 2); // 获取多边形的边界矩形 Rect roiRect = Cv2.BoundingRect(points); // 截取ROI区域 Mat roi = new Mat(image, roiRect); // 保存ROI到文件 roi.ImWrite("path_to_roi.jpg"); // 显示原始图像和ROI Cv2.ImShow("Original Image", image); Cv2.ImShow("ROI", roi); Cv2.WaitKey(0); // 释放资源 image.Release(); roi.Release(); } } ``` ### 3. 使用掩码(Mask)处理复杂形状ROI 对于更复杂的形状(如圆形、椭圆等),可以创建一个掩码图像,并结合 `CopyTo` 方法来提取特定区域的内容。以下是使用圆形掩码的示例: ```csharp using OpenCvSharp; class Program { static void Main(string[] args) { // 加载图像 Mat image = Cv2.ImRead("path_to_image.jpg"); // 创建一个空白掩码图像 Mat mask = new Mat(image.Size(), MatType.CV_8UC1, Scalar.All(0)); // 在掩码上绘制一个圆形 Point center = new Point(image.Cols / 2, image.Rows / 2); int radius = 100; Cv2.Circle(mask, center, radius, Scalar.White, -1); // -1 表示填充 // 创建输出图像 Mat result = new Mat(); // 应用掩码提取ROI image.CopyTo(result, mask); // 显示结果 Cv2.ImShow("Result", result); Cv2.WaitKey(0); // 释放资源 image.Release(); mask.Release(); result.Release(); } } ``` ### 总结 - **矩形ROI**:直接使用 `Rect` 和 `Mat` 构造函数进行截取。 - **多边形ROI**:通过 `Polylines` 绘制多边形后,使用 `BoundingRect` 获取其边界矩形再进行截取。 - **复杂形状ROI**:借助掩码技术,使用 `CopyTo` 方法提取任意形状ROI内容。 这些方法可以根据实际需求选择使用,既适用于简单的矩形区域,也支持复杂的多边形或圆形区域的截取。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值