HALCON-OpenCV-ROI绘制截取ROI图像

1.HALCON中ROI区域实现,图像截取

read_image (Board, 'E:/Images/board.jpg')
gen_circle (ROI_Circle, 252, 190, 17)
gen_rectangle1 (ROI_Rect, 323, 356, 416, 490)
gen_rectangle2 (ROI_RectPHi, 183, 240, rad(-46), 51, 20)

gen_ellipse (ROI_Ellipse, 265, 417, rad(0), 43, 11)

gen_ellipse (ROI_EllipsePhi, 215, 417, rad(-10), 43, 11)

gen_region_polygon(Region, [100,200,300,340,220,100], [100,60,80,160,100,100])


*矩形ROI变换位置
hom_mat2d_identity(HomMat2DIdentity)
hom_mat2d_translate(HomMat2DIdentity,60, 60, HomMat2DTranslate)
hom_mat2d_rotate_local(HomMat2DTranslate, rad(10), HomMat2DRotate)

affine_trans_region(ROI_Rect, RegionTrans, HomMat2DRotate, 'nearest_neighbor')

效果:

2.opencv实现ROI

Mat image = imread("E:/Images/board.jpg");
	imshow("image",image);
	Mat dst = image.clone();

	1.多边形	
	vector<Point> polypts;
	polypts.push_back(Point(100, 100));
	polypts.push_back(Point(60, 200));
	polypts.push_back(Point(80, 300));
	polypts.push_back(Point(160, 340));
	polypts.push_back(Point(100, 220));
	polypts.push_back(Point(100, 100));
	
	Mat PolyReduImg = Mat::zeros(image.size(), CV_8UC3);
	Mat polyMask = Mat::zeros(image.size(), CV_8UC1);
	polylines(image, polypts, 1, Scalar(0, 0, 255), 2, 8, 0);
	imshow("DrawPoly",image);

	vector<vector<Point> > polyvpts;
	polyvpts.push_back(polypts);
	fillPoly(polyMask, polyvpts, Scalar(255, 255, 255), 8, 0);

	bitwise_and(dst, dst, PolyReduImg, polyMask);
	imshow("Mask", polyMask);
	imshow("PolyReduImg", PolyReduImg);

	//2.使用 contour (轮廓)来指定多边形roi//
	vector<vector<Point>> contour;
	vector<Point> points;
	points.push_back(Point(100, 100));
	points.push_back(Point(60, 200));
	points.push_back(Point(80, 300));
	points.push_back(Point(160, 340));
	points.push_back(Point(100, 220));
	points.push_back(Point(100, 100));
	contour.push_back(points);
	Mat ContourRoi = Mat::zeros(image.size(), CV_8U);
	drawContours(ContourRoi, contour, 0, Scalar::all(255), -1);

	Mat ContourImg = Mat::zeros(image.size(), image.type());
	image.copyTo(ContourImg, ContourRoi);

	imshow("roi", ContourRoi);
	imshow("image", image);
	imshow("dst22", ContourImg);
		

	///3.画圆//

	//圆形
	Mat dstCircleImg = Mat::zeros(image.size(), image.type());
	Mat cirlceMask = Mat::zeros(image.size(), CV_8U);

	Point circleCenter(190, 252);
	int radius = 17;

	circle(cirlceMask, circleCenter, radius, Scalar(255), -1);
	bitwise_and(image, image, dstCircleImg, cirlceMask);
	//image.copyTo(dstCircleImg, cirlceMask);

	imshow("CircleMask", cirlceMask);
	imshow("image", image);
	imshow("dstCircleImg", dstCircleImg);


	///4.椭圆形/
	Mat dst1 = Mat::zeros(image.size(), image.type());
	Mat mask1 = Mat::zeros(image.size(), CV_8U);

	Point ellipseCenter(417,215);
	// 画椭圆
	ellipse(mask1, ellipseCenter, Size(43, 11), 10, -180, 180, Scalar(255), -1);
	
	//image.copyTo(dst1, mask1);
	bitwise_and(image, image, dst1, mask1);
	imshow("mask", mask1);
	imshow("image", image);
	imshow("dst", dst1);

	5.矩形/
	// 设置ROI
	// 方法一
	cv::Mat roiImage = image(cv::Rect(100, 100, 200, 100));
	// 方法二,第一个range表示起始行和终止行,第二个range是起始列和终止列
	//cv::Mat roiImage = testImage(cv::Range(100, 100 + 100), cv::Range(100, 200 + 100));
	// 画一个矩形
	


	Mat rectMask = Mat::zeros(image.size(), CV_8U);
	//rectangle(rectMask, cv::Rect(356, 323, 490 - 356, 416 - 323), cv::Scalar(255, 0, 0), 10);
	rectMask(Rect(356, 323, 490 - 356, 416 - 323)) = 255;
	Mat rectimg;
	bitwise_and(image, image, rectimg, rectMask);
	imshow("rectMask",rectMask);
	imshow("RectImage", rectimg);

	//对矩形进行平移与旋转
	//定义平移矩阵	
	Mat Translatemat =cv::Mat::zeros(2, 3, CV_32FC1); 
	Translatemat.at<float>(0, 0) = 1;
	Translatemat.at<float>(0, 2) = 30; //水平平移量
	Translatemat.at<float>(1, 1) = 1;
	Translatemat.at<float>(1, 2) = 30; //竖直平移量
	//根据平移矩阵进行仿射变换
	Mat translateMask;
	cv::Size dst_sz = src.size();
	warpAffine(rectMask, translateMask, Translatemat, dst_sz);

	imshow("translateMask", translateMask);
	Mat RotateMat=getRotationMatrix2D(Point2f(60,60), 10, 1.0);

	Size roateS_z;
	warpAffine(translateMask, translateMask, RotateMat, roateS_z);
	imshow("RotateMask", translateMask);

	Mat affineImage;
	bitwise_and(image, image, affineImage, translateMask);

	imshow("affineImage", affineImage);

效果:

猜你喜欢

转载自blog.csdn.net/liyuqian199695/article/details/106771923
ROI