作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

#include "cv.h"
#include "highgui.h"
#include <stdio.h>CvPoint prev_pt={-1,-1} ;
CvPoint pt_beg={-1,-1},pt_end = {-1,-1};
CvPoint pt1={-1,-1},pt2={-1,-1};
CvRect rect;
IplImage *src;
IplImage *tmp;void onMouse(int event,int x,int y,int flags,void *param);int main(int argc,char **argv)
{
IplImage *dst;
int c;
if ((argc !=2)||!(src=/blog.armyourlife.info/cvLoadImage(argv[1],1)))
{
printf("Error when Loading the Picture....Exit/n");
return -1;
}cvNamedWindow("SRC",1);
cvShowImage("SRC",src);
tmp = cvCloneImage(src);cvSetMouseCallback("SRC",onMouse,0);for (;;)
{
c = cvWaitKey(10);
if ((char)c=='c')
{
if (pt_beg.x!=-1)
{
rect.x = min(pt_beg.x,pt_end.x);
rect.y = min(pt_beg.y,pt_end.y);
rect.height = abs(pt_end.y-pt_beg.y);
rect.width = abs(pt_end.x-pt_beg.x);
printf("RECT:height=%d,width=%d/n",rect.height,rect.width);
cvSetImageROI(src,rect);
printf("ROI:Height=%d,Width=%d./n",src->roi->height,src->roi->width);
dst = cvCreateImage(cvSize(rect.width,rect.height),src->depth,src->nChannels);
dst = cvCloneImage(src);
printf("DST Height=%d,Width=%d/n",dst->height,dst->width);
cvNamedWindow("Selected",1);
cvShowImage("Selected",dst);
cvSaveImage("selected.jpg",dst);
printf("Finished!/n");
cvWaitKey(0);
cvDestroyWindow("Selected");
cvReleaseImage(&dst);
break;
}
}
else if ((char)c==27) //ESC to exit
{
cvReleaseImage(&tmp);
cvReleaseImage(&src);
cvDestroyWindow("SRC");
break;
}
}
return 0;
}void onMouse(int event,int x,int y,int flags,void *)
{
printf("x=%d,y=%d./n",x,y);
printf("Begin:x=%d,y=%d./n",pt_beg.x,pt_beg,y);
printf("END:x=%d,y=%d./n",pt_end.x,pt_end.y);
if (!tmp)
{
return ;
}/*判断左键是否放开,并且没有进行拖拽*/
if (event == CV_EVENT_LBUTTONUP||!(flags & CV_EVENT_FLAG_LBUTTON))
{//CV_EVENT_LBUTTONUP左键放开,CV_EVENT_FLAG_LBUTTON左键拖拽,
prev_pt=cvPoint(-1,-1);
}/*若左键按下则记录为起始点*/
else if (event == CV_EVENT_LBUTTONDOWN)
{
prev_pt = cvPoint(x,y);
pt_beg = cvPoint(x,y);
}/*若鼠标在滑动,并且在拖拽状态*/
else if (event == CV_EVENT_MOUSEMOVE && (flags && CV_EVENT_FLAG_LBUTTON) )
{
cvCopy(src,tmp);
CvPoint pt =cvPoint(x,y);/*得到另外两个点,以便进行矩形拖动绘制*/
pt1.x = pt.x;
pt1.y = prev_pt.y;
pt2.x = prev_pt.x;
pt2.y = pt.y;cvLine( tmp, prev_pt, pt1, cvScalarAll(255), 2, 8, 0 );
cvLine( tmp, prev_pt, pt2, cvScalarAll(255), 2, 8, 0 );
cvLine( tmp, pt1, pt, cvScalarAll(255), 2, 8, 0 );
cvLine( tmp, pt2, pt, cvScalarAll(255), 2, 8, 0 );pt_end = pt;
cvShowImage("SRC",tmp);
}
}

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

【OpenCV学习】抠图相关推荐

  1. opencv 图像 抠图 算法_opencv提取轮廓与抠图

    自然图像抠图/视频抠像技术梳理(image matting, video matting)-计算机视视觉专题1 图像抠图算法学习 - Shared Sampling for Real-Time Alp ...

  2. 【youcans 的 OpenCV 学习课】7. 空间域图像滤波

    专栏地址:『youcans 的图像处理学习课』 文章目录:『youcans 的图像处理学习课 - 总目录』 [youcans 的 OpenCV 学习课]7. 空间域图像滤波 图像滤波是在尽可能保留图像 ...

  3. OpenCv学习笔记4--图像分割之GrabCut算法

    说明: 本文章是opencv学习笔记系列的第四篇小结,可能前几篇内容太多,排版也不甚合理,所以为了更好的观看体验,这次的内容会稍微少那么一点点,再次重申 所有代码在我的github主页https:// ...

  4. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  5. opencv学习笔记(二):基于肤色的人手检测

    opencv学习笔记(二):基于肤色的人手检测 原文:http://blog.csdn.net/wzmsltw/article/details/50849810 先写了人手的检测程序,下一步基于检测程 ...

  6. Python+OpenCV学习(17)---摄像机标定

    Python+OpenCV学习(17)---摄像机标定 原文:http://blog.csdn.net/firemicrocosm/article/details/48594897 利用python学 ...

  7. OpenCV学习之六: 使用方向梯度直方图估计图像旋转角度

    OpenCV学习之六: 使用方向梯度直方图估计图像旋转角度 原文:http://blog.csdn.net/zhjm07054115/article/details/26964275 下面的代码通过计 ...

  8. python做直方图-python OpenCV学习笔记实现二维直方图

    本文介绍了python OpenCV学习笔记实现二维直方图,分享给大家,具体如下: 官方文档 – https://docs.opencv.org/3.4.0/dd/d0d/tutorial_py_2d ...

  9. OpenCV学习--saturate_cast防止数据溢出

    在OpenCV学习中经常看见saturate_cast的使用,下面的代码会展示它的作用,详细的代码可以参见文章http://blog.csdn.net/mjlsuccess/article/detai ...

  10. OpenCV学习笔记大集锦

    转载自: OpenCV学习笔记大集锦 – 视觉机器人 http://www.cvrobot.net/collect-opencv-resource-learn-study-note-chinese/ ...

最新文章

  1. 超算学院计算机系吧,上海交通大学计算机科学与工程系(CSE)
  2. fastjson又被发现漏洞,这次危害可导致服务瘫痪!
  3. python画图代码彩虹-用python画一颗彩虹色爱心送给女朋友!!!
  4. leetcode算法题--替换所有的问号
  5. gj4 深入类和对象
  6. EnumWindows 使用
  7. 跨站点脚本(XSS)
  8. Elasticsearch 7.7.0 基本操作-基于 CMD 命令行
  9. 如何判断一棵二叉树是完全二叉树(1)
  10. 计算一个子网掩码有多少个有效ip地址_一个月有多少个工作日,你会计算了吗?...
  11. Session丢失的解决办法小结(转)
  12. mysql 5.7 安装后添加root用户
  13. GMA Round 1 向量计算
  14. java中spring的注解_Java代码中spring注解浅析
  15. java程序员和java架构师有什么区别呢?
  16. Quartz 在线Cron表达式
  17. 蓝牙信标人员定位技术原理分析
  18. 自己动手写CPU——寄存器堆、数据存储器(基于FPGA与Verilog)
  19. 做报表到10点才下班,做的还是丑,怎样才能做出一张好看的报表?
  20. win10系统,点击连接校园网WLAN后,弹不出登录网页

热门文章

  1. 再谈HTTP2性能提升之背后原理—HTTP2历史解剖
  2. zookeeper基础知识整理
  3. python网络编程
  4. 大佬带你深入浅出Lua虚拟机
  5. 尽可能保留原有数据,建立UEFI与BIOS双启PE优盘
  6. MySQL 慢查询日志分析及可视化结果
  7. 测试openstack neutron的网络连通性
  8. Apache,php配置
  9. 可穿戴智能设备的发展趋势及技术变化
  10. GDI+中发生一般性错误