日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenCV图像剪切,超出图像区域指定颜色填充

發布時間:2024/4/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV图像剪切,超出图像区域指定颜色填充 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV圖像剪切,超出圖像區域指定顏色填充

尊重原創,轉載請注明出處】http://blog.csdn.net/guyuealian/article/details/77486096 在OpenCV中實現圖像裁剪和剪切是很簡單的,但剪切時常常會出現超出邊界的區域的情況,對于超出圖像邊界的區域,我們希望可以采用指定的顏色來填充。OpenCV3中提供了一個填充邊界的函數cv::copyMakeBorder(對應opencv2中的cvCopyMakeBorder),利用這個函數,可以實現這個功能。下面實現一個Demo,對于超出剪切的區域,用紅色填充。 若想在Matlab中實現圖像剪切,對超出圖像區域指定顏色填充,可參考本人的博客http://blog.csdn.net/guyuealian/article/details/77507969#include "stdafx.h" #include <iostream> #include <opencv2\opencv.hpp> #include <opencv2\highgui\highgui.hpp> using namespace std; using namespace cv;cv::Mat im_crop1(cv::Mat srcImage, cv::Rect rect) {cv::Mat destImage = cv::Mat::zeros(rect.height, rect.width, 0);// 目標圖像 // 獲取可填充圖像 int crop_x1 = cv::max(0, rect.x);int crop_y1 = cv::max(0, rect.y);int crop_x2 = cv::min(srcImage.cols - 1, rect.x + rect.width - 1); // 圖像范圍 0到cols-1, 0到rows-1 int crop_y2 = cv::min(srcImage.rows - 1, rect.y + rect.height - 1);cv::Mat roiImage = srcImage(cv::Range(crop_y1, crop_y2 + 1), cv::Range(crop_x1, crop_x2 + 1));// 左包含,右不包含 // 如果需要填邊 int left_x = (-rect.x);int top_y = (-rect.y);int right_x = rect.x + rect.width - srcImage.cols;int down_y = rect.y + rect.height - srcImage.rows;if (top_y > 0 || down_y > 0 || left_x > 0 || right_x > 0)//只要存在邊界越界的情況,就需要邊界填充{left_x = (left_x > 0 ? left_x : 0);right_x = (right_x > 0 ? right_x : 0);top_y = (top_y > 0 ? top_y : 0);down_y = (down_y > 0 ? down_y : 0);cv::copyMakeBorder(roiImage, destImage, top_y, down_y, left_x, right_x, cv::BORDER_CONSTANT, cv::Scalar(0,0,255));//cv::Scalar(0,0,255)指定顏色填充// 自帶填充邊界函數,top_y, down_y, left_x, right_x為非負正數 // 而且I.cols = roi_img.cols + left_x + right_x, I.rows = roi_img.rows + top_y + down_y }else//若不存在邊界越界的情況,則不需要填充了{destImage = roiImage;}return destImage; }cv::Mat im_crop2(cv::Mat img, cv::Rect rect) {cv::Mat I = cv::Mat::zeros(rect.height, rect.width, 0);// 目標圖像 // 獲取可填充圖像 int crop_x1 = cv::max(0, rect.x);int crop_y1 = cv::max(0, rect.y);int crop_x2 = cv::min(img.cols - 1, rect.x + rect.width - 1); // 圖像范圍 0到cols-1, 0到rows-1 int crop_y2 = cv::min(img.rows - 1, rect.y + rect.height - 1);cv::Mat roi_img = img(cv::Range(crop_y1, crop_y2 + 1), cv::Range(crop_x1, crop_x2 + 1));// 左包含,右不包含 // 截取圖像在I中位置 int x1 = crop_x1 - rect.x;int y1 = crop_y1 - rect.y;int x2 = crop_x2 - rect.x;int y2 = crop_y2 - rect.y;I(cv::Range(y1, y2 + 1), cv::Range(x1, x2 + 1)) = I(cv::Range(y1, y2 + 1), cv::Range(x1, x2 + 1)) + roi_img;// 此處用加法,雖然I初始設置值全0,但是如果不用加法,直接“=”賦值,結果為0,不是想要的結果 return I; } int main(int argc) {Mat src = imread("E:\\MatlabTest2\\images\\liuyifei.jpg");//原始圖像是700*500cv::imshow("src", src);//cv::cvtColor(src, src, CV_RGB2GRAY);cv::Mat resize_img;cv::resize(src, resize_img, cv::Size(src.cols*0.5, src.rows*0.5), 0, 0, CV_INTER_LINEAR);// 縮小圖像cv::imshow("resize_img", resize_img);cv::Rect rect(50, 50, 100, 100);// 裁剪圖像,越界部分指定顏色填充// 函數im_crop1:使用與RGB和灰度圖像// 函數im_crop2:使用與灰度圖像cv::Mat crop_im1 = im_crop1(resize_img, rect);//cv::Mat crop_im = im_crop2(src1, rect);cv::imshow("crop_im1", crop_im1);cvWaitKey(0);return 0; }

?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的OpenCV图像剪切,超出图像区域指定颜色填充的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。