我是靠谱客的博主 单身店员,最近开发中收集的这篇文章主要介绍OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

涉及到两方面的内容:1. 用鼠标画出矩形。2.在图像上绘制出点的坐标

  1. 用鼠标绘制矩形,涉及到鼠标的操作,opencv中有鼠标事件的介绍。需要用到两个函数:回调函数CvMouseCallback和注册回调函数cvSetMouseCallback.

当回调函数被调用时,opencv会传入合适的值,当鼠标有动作时,有所反应,比如画线,描点。

void CvMouseCallback(int event,int x,int y,int flags,void * param);

event 为鼠标事件类型,值为以下一种:CV_EVENT_MOUSEMOVE,CV_EVENT_LBUTTONDOWN,CV_EVENT_RBUTTONDOWN,CV_EVENT_MBUTTONDOWN,CV_EVENT_RBUTTONUP,CV_EVENT_LBUTTONUP,CV_EVENT_MBUTTONUP,CV_EVENT_LBUTTONBLCLK,CV_EVENT_RBUTTONBLCLK,CV_EVENT_MBUTTONBLCLK.

x,y表示事件发生时鼠标位置的x,y坐标值。

flags的值表示了别的键如ctrlshift键是否被触发。

Param可以以任何结构方式传递额外的参数信息。

void cvSetMouseCallback(const char* window_name,CvMouseCallback on_mouse,void* param);

第一个参数指定了回调函数需要注册到的窗口,也就是产生事件的窗口。第二个参数为回调函数,第三个参数用来传递额外信息给回调函数中的param参数。

  1. 在图像上绘出点的坐标涉及到opencv中的绘图中的字体和文字。主要有函数cvPutTextcvInitFont.

void cvPutText(CvArr* img,const char* text,CvPoint origin,const CvFont* font,CvScalar clolor);

这个函数可以在图像上输出一些文本。

text所指向的文本将打印到图像上。若将点的坐标打印到图像上,就需要把点的坐标变成字符串,要用到sprintf函数。

Origin为指定文本框的左下角位置。

Void cvInitFont(CvFont* font,int font_face,double hscale,double vscale,double shear=0,int thinckness=1,int line_type=8);

hscalevscale表示字体的高度和宽度。Shear=0.0字体不倾斜,shear=1.0,字体倾斜。

 

Opencv程序和结果如下所示。

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>
#include <cstring> 
using namespace std;
void my_mouse_callback(int event,int x,int y,int flags,void* param);
CvRect box;
bool drawing_box=false;
void draw_box(IplImage* img,CvRect rect)
{
    cvRectangle(img,cvPoint(box.x,box.y),cvPoint(box.x+box.width,box.y+box.height),cvScalar(0x00,0x00,0xff));
}
CvFont font;
int main()
{
    
    cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.4,0.4,0,1,8);
    box=cvRect(-1,-1,0,0);
    IplImage* image=cvLoadImage("1.bmp");
    cout<<"**"<<image->width<<" "<<image->height<<"**"<<endl;
    //cvZero(image);
    IplImage* temp=cvCloneImage(image);
    cvNamedWindow("Box Example");
    cvSetMouseCallback("Box Example",my_mouse_callback,(void*)image);
    
    while(1)
    {
        cvCopy(image,temp);
        if(drawing_box) draw_box(temp,box);
        cvShowImage("Box Example",temp);
        if(cvWaitKey(30)==27) break;
    }
    
    cvSaveImage("temp.jpg",temp);
    cvReleaseImage(&image);
    cvReleaseImage(&temp);
    cvDestroyWindow("Box Example");
    return 0;

}
void my_mouse_callback(int event,int x,int y,int flags,void* param)
{
    IplImage* image=(IplImage*)param;
    switch(event)
    {
    case CV_EVENT_MOUSEMOVE:
        {
            if(drawing_box)
            {
                box.width=x-box.x;
                box.height=y-box.y;
            }
        }
        break;
    case CV_EVENT_LBUTTONDOWN:
        {
            drawing_box=true;
            box=cvRect(x,y,0,0);
            cout<<box.x<<" "<<box.y<<endl;
        }
        break;
    case CV_EVENT_LBUTTONUP:
        {
            drawing_box=false;
            draw_box(image,box);
            cout<<box.x<<" "<<box.y<<"&&"<<box.width<<" "<<box.height<<endl;
            char s1[32];
            char s2[32];
            
            sprintf(s1,"(%d,%d)",box.x,box.y);
            sprintf(s2,"%d",box.y);
    
            cvPutText(image,s1,cvPoint(box.x,box.y),&font,CV_RGB(0,0,255));
            
        }
        break;
    }
}

 

实验结果:

 

转载于:https://www.cnblogs.com/realkate1/p/4810695.html

最后

以上就是单身店员为你收集整理的OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标的全部内容,希望文章能够帮你解决OpenCV之响应鼠标(四):在图像上绘制出矩形并标出起点的坐标所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部