1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > C++ opencv 图片截取不规则ROI区域并将其他区域透明化

C++ opencv 图片截取不规则ROI区域并将其他区域透明化

时间:2023-06-30 09:29:06

相关推荐

C++ opencv 图片截取不规则ROI区域并将其他区域透明化

目的

将图片内不规则的ROI区域截取下来后,将非ROI区域的像素删除.

主要函数

cvFloodFill()

cvOr()(注: 与cvAnd用法雷同)

代码实现

IplImage *ipl_img = cvLoadImage("7890.jpg");// 将ROI区域用cvLine包裹cvLine(ipl_img, cvPoint(50, 100), cvPoint(70, 150), CV_RGB(255,255,255), 2, 8, 1);cvLine(ipl_img, cvPoint(70, 150), cvPoint(70, 360), CV_RGB(255,255,255), 2, 8, 1);cvLine(ipl_img, cvPoint(70, 360), cvPoint(50, 360), CV_RGB(255,255,255), 2, 8, 1);cvLine(ipl_img, cvPoint(50, 360), cvPoint(50, 100), CV_RGB(255,255,255), 2, 8, 1);// 掩码层,全黑图片Mat image0 = imread("7890.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);Mat M_mask = image0.clone();IplImage mask_img = M_mask;cvZero(&mask_img);// 同样包裹,点一样cvLine(&mask_img, cvPoint(50, 100), cvPoint(70, 150), CV_RGB(0, 255, 255), 2, 8, 1);cvLine(&mask_img, cvPoint(70, 150), cvPoint(70, 360), CV_RGB(0, 255, 255), 2, 8, 1);cvLine(&mask_img, cvPoint(70, 360), cvPoint(50, 360), CV_RGB(0, 255, 255), 2, 8, 1);cvLine(&mask_img, cvPoint(50, 360), cvPoint(50, 100), CV_RGB(0, 255, 255), 2, 8, 1);// 不规则ROI区域标定cvFloodFill(&mask_img,cvPoint(60, 250), // 点在ROI区域内即可Scalar(255, 255, 255),cvScalar(20, 30, 40, 0),cvScalar(20, 30, 40, 0));cvOr(ipl_img, &mask_img, ipl_img); // 或处理// 白色区域透明化Mat dst = cv::cvarrToMat(ipl_img); // IplImage* -> MatMat input_bgra;cvtColor(dst, input_bgra, CV_BGR2BGRA);// find all while pixel and set alpha value to zerofor (int y = 0; y < input_bgra.rows; ++y){for (int x = 0; x < input_bgra.cols; ++x){Vec4b &pixel = input_bgra.at<Vec4b>(y, x);if (pixel[0] == 255 && pixel[1] == 255 && pixel[2] == 255){pixel[3] = 0;}}}imwrite("testPng.png", input_bgra); // 注: 一定要以PNG形式保存

备注

图片保存要以PNG格式保存,因为JPG不支持透明背景.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。