在一个图形中抠出一个区域

//代码有错误
#include <cv.h>
#include <highgui.h>
IplImage* img;
void mouse_set(int event, int x, int y, int flags, void* param);
int main()
{
    img = cvLoadImage("001.jpg", 1);
    cvNamedWindow("main",1);
    cvSetMouseCallback("main", mouse_set, 0);
    cvShowImage("main", img);
    cvWaitKey(0);
    //cvReleaseImage(&img);
    //cvDestroyAllWindows();
}
void mouse_set(int event, int x, int y, int flags, void* param)
{
    IplImage* image = cvCloneImage(img);
    IplImage* src = cvCloneImage(img);
    IplImage* des = cvCloneImage(img);
    IplImage* finn = 0;
    static CvPoint src_point = { -1, -1 };
    static CvPoint des_point = { -1, -1};
    if (event == CV_EVENT_LBUTTONDOWN)
    {
        cvCopy(image, src);
        printf("%d %d\n", x, y);
        cvShowImage("main", src);
        src_point = cvPoint(x, y);
        cvCopy(des, src);
    }
    else if (event == CV_EVENT_MOUSEMOVE &&!(flags & CV_EVENT_FLAG_LBUTTON))
    {
        cvCopy(des, src);
        //printf("%d %d\n", x, y);
        //printf("--->%d %d\n", src_point.x, src_point.y);
        des_point = cvPoint(x, y);
        cvCopy(src, des);
    }
    else if (event == CV_EVENT_MOUSEMOVE &&(flags & CV_EVENT_FLAG_LBUTTON))
    {
        cvCopy(des, src);
        //printf("%d %d\n", x, y);
        //printf("--->%d %d\n", src_point.x, src_point.y);
        des_point = cvPoint(x, y);
        cvRectangle(src, src_point, des_point, cvScalar(0xff, 0, 0), 1, 8, 0);
        cvShowImage("main", src);
    }
    else if (event == CV_EVENT_LBUTTONUP )
    {
        cvCopy(des, src);
        //printf("%d %d\n", x, y);
        des_point = cvPoint(x, y);
        cvShowImage("main", src);
        cvCopy(src, des);
        CvRect rectangle;
        cvRectangle(src, src_point, des_point, cvScalar(0, 255, 0), 1, 8, 0);
        int width = abs(des_point.x - src_point.x);
        int height = abs(des_point.y - src_point.y);
        printf("src_point.x  = %d  src_point.y = %d , des_point.x = %d des_point.y = %d\n", src_point.x, src_point.y, des_point.x, des_point.y);
        finn = cvCreateImage(cvSize(width, height), img->depth, img->nChannels);
        if (src_point.x<des_point.x && src_point.y<des_point.y)
        {
            rectangle = cvRect(src_point.x, src_point.y, width, height);
        }
        else if (src_point.x>des_point.x && src_point.y<des_point.y)
        {
            rectangle = cvRect(des_point.x, src_point.y, width, height);
        }
        else if (src_point.x>des_point.x && src_point.y>des_point.y)
        {
            rectangle = cvRect(des_point.x, des_point.y, width, height);
        }
        else if (src_point.x<des_point.x && src_point.y>des_point.y)
        {
            rectangle = cvRect(src_point.x, des_point.y, width, height);
        }

        cvSetImageROI(img, rectangle);
        cvCopy(img, finn);
        cvResetImageROI(img);
        cvNamedWindow("show", 1);
        cvShowImage("show", finn);
        //cvSaveImage("finn1.jpg", finn);
        cvWaitKey(0);
        cvDestroyWindow("show");
    }
}
时间: 2024-12-11 18:00:08

在一个图形中抠出一个区域的相关文章

c#中在一个窗体中触发另一个窗体的事件

c#中在一个窗体中触发另一个窗体的事件 创建两个窗体,分别为form1,form2,在form1中添加控件textBox1和button1,创建一个form2的对象Form2 b = null; 在form2中添加button1,定义委托和事件 //定义委托 public delegate void MyDelegate(); //定义事件 public event MyDelegate MyEvent; 给form2中的button1添加消息相应函数并做修改 private void butt

AJAX 怎样在一个UpDatePanel中刷新另一个updatePanel

原文:AJAX 怎样在一个UpDatePanel中刷新另一个updatePanel 在页面上(.aspx)<asp:UpdatePanel ID="MyID1" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional"><ContentTemplate>          //html内容</ContentTemplate

Android 在一个程序中启动另一个程序

Android 开发有时需要在一个应用中启动另一个应用,比如Launcher加载所有的已安装的程序的列表,当点击图标时可以启动另一个应用. 一般我们知道了另一个应用的包名和MainActivity的名字之后便可以直接通过如下代码来启动: Intent intent = new Intent(Intent.ACTION_MAIN); intent.add

Android开发中在一个Activity中关闭另一个Activity

Android开发中在一个Activity中关闭另一个Activity 比如有ActivityA, ActivityB,在ActivityB中关闭ActivityA 解决方案: 1. 在 ActivityA 里面设置一个静态的变量instance,初始化为this在 ActivityB 里面, ActivityA.instance.finish(); 2. 也可以通过ActivityManager ActivityManager manager = (ActivityManager)getSys

在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体

在C#中使用Panel控件实现在一个窗体中嵌套另一个窗体ShowAllPage sAllPage = new ShowAllPage();          //  sAllPage.FormBorderStyle = FormBorderStyle.None;           // sAllPage.Dock = DockStyle.Fill;            sAllPage.TopLevel = false;            this.MainPanel.Controls.

CAD技巧,怎么在CAD中绘制出一个表格?

CAD技巧,怎么在CAD中绘制出一个表格?当我们在日常的工作中绘制CAD图纸的时候,遇到比较复杂的图纸就需要在CAD图纸中添加一些数据说明,一般编辑CAD图纸都是借助CAD编辑器来进行绘制的,那怎么在CAD中绘制出一个表格?具体要怎么来进行操作?今天小编就通过这篇文章来告诉大家怎么在CAD中绘制出一个表格?下面就一起来看看具体操作步骤吧! 第一步:首先如果小伙伴们电脑上没有安装CAD编辑器的,可以在浏览器中搜索迅捷CAD编辑器(标准版),进入到官网,根据提示步骤来下载安装最新版本的CAD编辑器.

在一个工程中使用另外一个工程的类

比如我们在A工程中定义了类A,但是在另外一个工程中的类B中想调用类A中的函数,这时,可以在类A的头文件中加入如下代码: #if !defined(AFX_DRAWPOLYLINEJIG__INCLUDED_) #define AFX_DRAWPOLYLINEJIG__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 同时在类A的源文件中加入如下代码(在源文件所包含的头文件下面加): #include &qu

Android在一个Activity中关闭另一个Activity

比如有ActivityA, ActivityB,在ActivityB中关闭ActivityA. 解决方案: 1.在 ActivityA 里面设置一个静态的变量instance,初始化为this,在 ActivityB 里面, ActivityA.instance.finish(); 2.也可以通过ActivityManager ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); manage

【Android笔记】在一个Activity中结束另一个Activity

以在Activity_B中结束Activity_A为例: 1.在Activity_A中定义一个Acitivity的全局静态变量: 1 public static Activity actA; 2.在Activity_A的OnCreate()方法中给Activity_A赋值: 1 actA=this; 3.在Activity_B中,需要结束Activity_A时,调用以下: 1 ActivityA.actA.finish(); 另外也可用广播的方式实现(此处忽略了,需要的自己试下吧) 参考原文:h