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);
效果: