main.cpp

cv::Mat CropImage(cv::Mat& src, cv::RotatedRect& rotatedRect);
cv::Mat MaxBoxSelectionRotatedRect(cv::Mat& src, cv::RotatedRect& ret); int main()
{
#if 1
cv::VideoCapture capture;
cv::Mat rawData;
cv::Mat ROI;
cv::namedWindow("Show", cv::WINDOW_NORMAL);
cv::namedWindow("ROI", cv::WINDOW_AUTOSIZE);
capture.open(0);
capture.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
#if 0
capture.set(cv::CAP_PROP_FRAME_WIDTH, 3264);
capture.set(cv::CAP_PROP_FRAME_HEIGHT, 2448);
#endif
cv::RotatedRect rotatedRect;
while (capture.isOpened())
{
capture >> rawData;
if (rawData.empty()){break;}
/******************************算法处理*******************************************/
#if 1
if (cv::waitKey(1) == Esc)
{
cv::imwrite("640x480.jpg", rawData);
}
cv::Mat src = rawData.clone();
src = MaxBoxSelectionRotatedRect(src, rotatedRect);
ROI = CropImage(rawData, rotatedRect);
#else
ROI = ImageColorMode(rawData, 3);
#endif /*********************************************************************************/
cv::imshow("ROI", ROI);
cv::imshow("Show", src);
//退出循环
if (cv::waitKey(1) == Esc)
{
cv::imwrite("640x480.jpg", rawData);
break;
}
}
#else #endif
pause();
return 0;
}
cv::Mat CropImage(cv::Mat& src,cv::RotatedRect& rotatedRect)
{
//std::cout << rotatedRect.size.width << "x" << rotatedRect.size.height << std::endl;
//定义框架边框边距像素大小以及参照物像素大小
const int pixel = 10;
const int defaultPixel = 5000000; //获取4个最小矩形四个顶点
cv::Point2f pts[4];
rotatedRect.points(pts); //获取最小矩形中心点
cv::Point2f center = cv::Point2f((pts[0].x + pts[2].x) / 2, (pts[0].y + pts[2].y) / 2);
//获取旋转角度
double angle = rotatedRect.angle; std::cout << "angle:" << angle << std::endl;
#if 0
//获取最小矩形长和宽 获取该参数可实现长方形矩形始终水平放置
int lineWidth = sqrt((pts[1].y - pts[0].y)*(pts[1].y - pts[0].y) + (pts[1].x - pts[0].x)*(pts[1].x - pts[0].x));
int lineHeight = sqrt((pts[3].y - pts[0].y)*(pts[3].y - pts[0].y) + (pts[3].x - pts[0].x)*(pts[3].x - pts[0].x));
#endif //
cv::Rect roi;
//边距
int margin = pixel * src.cols * src.rows / defaultPixel;
//宽
roi.width = rotatedRect.size.width - margin * 2;
//高
roi.height = rotatedRect.size.height - margin * 2;
//矩形起始坐标
roi.x = center.x - roi.width / 2;
roi.y = center.y - roi.height / 2; //目标框选超出范围部分像素直接砍掉
if (roi.x < 0) roi.x = 0;
if (roi.y < 0) roi.y = 0;
if (roi.x + roi.width > src.cols)
{
roi.width = src.cols - roi.x;
}
if (roi.y + roi.height > src.rows)
{
roi.height = src.rows - roi.y;
} cv::Mat dst(src.rows, src.cols, CV_8UC3, cv::Scalar(0, 0, 0));
//获取仿射矩阵 M
cv::Mat matrix2D = cv::getRotationMatrix2D(center, angle, 1);
//变换图像
cv::warpAffine(src, dst, matrix2D, cv::Size(src.cols, src.rows)); //ROI 最终结果
cv::Mat ret(dst,roi);
#if 0
cv::namedWindow("Return");
cv::imshow("Return",ret);
#endif
return ret;
}
cv::Mat MaxBoxSelectionRotatedRect(cv::Mat& src, cv::RotatedRect& ret)
{
cv::Mat dst = src.clone();
//颜色模型转换
cv::cvtColor(src, src, cv::COLOR_BGR2HSV_FULL);
//cv::Mat 向量容器
std::vector<cv::Mat> threeChannels;
//分割HSV模型,提取 V(亮度) 通道
cv::split(src, threeChannels);
cv::threshold(threeChannels.back(), src, 0, 255, cv::THRESH_OTSU);
std::vector<std::vector<cv::Point>> contours;
cv::findContours(src, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
//假设最大轮廓值向量容器索引
size_t maxContoursIndex = contours.size() - 1;
//遍历向量容器
for (size_t i = maxContoursIndex; i > 0; i--)
{
//寻找最大点集
//if (contours.at(i).size() > contours.at(maxContoursIndex).size())
//寻找最大的轮廓
if (cv::contourArea(contours.at(i)) > cv::contourArea(contours.at(maxContoursIndex)))
{
//最大轮廓在向量容器中的位置
maxContoursIndex = i;
}
} //std::cout << "contourAreaMax:" << cv::contourArea(contours.at(maxContoursIndex)) << std::endl;
if (cv::contourArea(contours.at(maxContoursIndex)) < 488.0)//double minAreaRectSize = 488;
{
return dst;
} ret = cv::minAreaRect(contours.at(maxContoursIndex)); const int pixel = 10;
const int defaultPixel = 5000000;
int lineWidth = 2 * (dst.cols * dst.rows / 5000000);
cv::Point2f pts[4];
ret.points(pts);
#if 1
//绘制最小外接矩形
for (int i = 0; i < 4; ++i) {
line(dst, pts[i], pts[(i + 1) % 4], cv::Scalar(0, 255, 0), lineWidth);
}
#else
roi = dst(cv::boundingRect(contours.at(maxContoursIndex)));
//绘制最大外接矩形
cv::rectangle(dst, cv::boundingRect(contours.at(maxContoursIndex)), cv::Scalar(0, 255, 0), 2, 8);
#endif
return dst;
}

Opencv 330 如何裁剪图片中大的目标?的更多相关文章

  1. Java+jquery实现裁剪图片上传到服务器

    大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...

  2. PHP图片裁剪与缩放 / 无损裁剪图片

    图片太大且规格不统一,显示的控制需要靠JavaScript来完成,用在移动设备上时显示效果不好且流量巨大,需要对现有图片库的图片进行一次处理,生成符合移动设备用的缩略图,将原来客户端JS做的工作转移到 ...

  3. PHP裁剪图片

    PHP裁剪图片 $src_path = '1.jpg'; //创建源图的实例 $src = imagecreatefromstring(file_get_contents($src_path)); / ...

  4. 【转】java缩放图片、java裁剪图片代码工具类

    一首先看下效果 二工具类 三测试类 在系统的上传图片功能中,我们无法控制用户上传图片的大小,用户可能会上传大到几十M小到1k的的图片,一方面图片太大占据了太多的空间,另一方面,我们没办法在页面上显示统 ...

  5. MVC使用JCrop上传、裁剪图片

    JCrop用来裁剪图片,本篇想体验的是: 在视图页上传图片: 上传成功,跳转到另外一个编辑视图页,使用JCrop对该图片裁剪,并保存图片到指定文件夹: 裁剪成功后,在主视图页显示裁剪图片: 当然,实际 ...

  6. java裁剪图片

    java裁剪图片保存到指定位置 /** * 图片裁剪通用接口 * * @param src 源图片地址,图片格式PNG * @param dest 目的图片地址 * @param x 图片起始点x坐标 ...

  7. Flutter裁剪图片

    最近在学习中需要用到裁剪图片,记录一下解决方法 思路: 使用canvas的drawImageRect()方法,对Image进行裁剪,这里的Image需要 'dart:ui' 库中的Image. 1. ...

  8. iOS开发——UI进阶篇(十八)核心动画小例子,转盘(裁剪图片、自定义按钮、旋转)图片折叠、音量震动条、倒影、粒子效果

    一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // re ...

  9. IOS 按比例裁剪图片

    拍照或者从图片库中获取图片 操作过程中容易闪退,也总会有内存压力警告,第一步,首先可以考虑裁剪图片,实际上可能不需要那么大的.其次可以考虑把耗时的比如存储过程放进线程. 这里封装裁剪图片的类方法. / ...

随机推荐

  1. python3 第一章 - 简介

    1.什么是python 引用官方的话:Python是一种易于学习,强大的编程语言.它具有高效的高级数据结构,并通过简单而有效的方法来进行面向对象编程.Python的优雅语法和动态类型,以及其解释性质, ...

  2. linux_常用命令_2

    rev 反向读取, reverse echo 123456 | rev # 结果为 654321 rev Name.txt # 行号没变,每一行的数据翻转过来 less 具有more命令所有功能,更加 ...

  3. linux_远程连接

    为什么要远程连接linux服务器? 温度.湿度.电力各种影响,有的企业使用阿里云服务器,更加接触不到机房,所有需要通过远程连接服务器来进行管理 IP地址? 互联网上的计算机,都会有一个唯一的32位地址 ...

  4. 剑指offfer:二维数组中的查找

    题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成这样一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例如: 1    2  ...

  5. sqlserver 字符串截取与拼接

    update yanan set name=name+right(phone,4) where id=56 其中right(phone,4)是截取手机号后四位,left是从左开始截取.name=nam ...

  6. java里程碑之泛型--泛型注意的几点

    1,泛型的基本语法:类名<具体类> 对象名 = new 类名<具体类>().类型参数规范如下: 1),K键,比如映射的键,key的类型 2),V值,比如Map的值,value类 ...

  7. atom中开发vue常用插件

    atom: 开发利器,界面友好,配色出色,好用的插件众多. language-vue: 这个是首推,因为它就是为vue而生的呀,支持很多vue里的提示.在空的vue页面敲tem,vue模板的提示就自动 ...

  8. CURL post/get提交

    public function curlss($url){ $curl = curl_init(); // 设置你需要抓取的URL curl_setopt($curl, CURLOPT_URL, $u ...

  9. maven将本地jar包导入本地仓库

    从maven中央仓库下载下来的jar包手动导入本地库,如下图 以下其中maven的dependency <dependency> <groupId>org.molgenis&l ...

  10. 二分图匹配 洛谷 [P3386]

    最为经典的匈牙利算法 匈牙利算法应用了增广路的性质,实际上就是通过搜索可行的增广路,每搜到一条,匹配数++ 还可以应用配对的方法去理解,此算法的时间复杂度 (V*E),比较慢,但是实现较为简单. df ...