精华内容
下载资源
问答
  • Opencv Line函数

    千次阅读 2019-04-06 16:18:33
    Opencv Line函数学习 看OpenCV时看到自己不常用的Line函数时不禁想到之前每次对图像进行处理都是在已有图片上进行空域或者频域操作完成的,而如果要在图片上画框rect或者画线line是如何做到的呢,既然Line函数并没用...

    Opencv Line函数学习

    看OpenCV时看到自己不常用的Line函数时不禁想到之前每次对图像进行处理都是在已有图片上进行空域或者频域操作完成的,而如果要在图片上画框rect或者画线line是如何做到的呢,既然Line函数并没用可以选择的算法类型,那么用的是DDA或者Bresenham还是哪种方法呢(虽然不可能是DDA哈哈)?出于好奇心去看了OpenCV的源代码。

    OpenCV源代码Line函数定义:

    static void
    Line( Mat& img, Point pt1, Point pt2,
          const void* _color, int connectivity = 8 )
    {
        //必须为8连通或者4连通
        if( connectivity == 0 )
            connectivity = 8;
        else if( connectivity == 1 )
            connectivity = 4;
    //迭代类
        LineIterator iterator(img, pt1, pt2, connectivity, true);
        int i, count = iterator.count;//p1,p2点间的像素总数
        int pix_size = (int)img.elemSize();//每个元素的数据大小
        const uchar* color = (const uchar*)_color;
    
        for( i = 0; i < count; i++, ++iterator )
        {
            uchar* ptr = *iterator;
            if( pix_size == 1 )
                ptr[0] = color[0];
            else if( pix_size == 3 )
            {
                ptr[0] = color[0];
                ptr[1] = color[1];
                ptr[2] = color[2];
            }
            else
                memcpy( *iterator, color, pix_size );
        }
    }
    

    嘛,说白了,具体操作还是在LineIterator 定义的类中,官方是这么说的:

    The class is used to iterate over all the pixels on the raster line segment connecting two specified points.
    
    The class LineIterator is used to get each pixel of a raster line. It can be treated as versatile implementation of the Bresenham algorithm where you can stop at each pixel and do some extra processing.
    

    这里已经解开谜题了,就是说他就是Bresenham算法的实现,可以在像素上进行一些额外的操作比如异或,那么我们来看看这个LineIterator 的重载里干了什么:

    LineIterator::LineIterator(const Mat& img, Point pt1, Point pt2,
                               int connectivity, bool left_to_right)
    {
        count = -1;
    
        CV_Assert( connectivity == 8 || connectivity == 4 );
    //错误操作处理
        if( (unsigned)pt1.x >= (unsigned)(img.cols) ||
            (unsigned)pt2.x >= (unsigned)(img.cols) ||
            (unsigned)pt1.y >= (unsigned)(img.rows) ||
            (unsigned)pt2.y >= (unsigned)(img.rows) )
        {
            if( !clipLine( img.size(), pt1, pt2 ) )
            {
                ptr = img.data;
                err = plusDelta = minusDelta = plusStep = minusStep = count = 0;
                ptr0 = 0;
                step = 0;
                elemSize = 0;
                return;
            }
        }
    
        size_t bt_pix0 = img.elemSize(), bt_pix = bt_pix0;
        size_t istep = img.step;
        
        int dx = pt2.x - pt1.x;
        int dy = pt2.y - pt1.y;
        int s = dx < 0 ? -1 : 0;//绝对值操作
        
    //此处即为官方解释中的 If leftToRight=true, then the iteration is always done from the left-most point to the right most, not to depend on the ordering of pt1 and pt2 parameters的意思
        if( left_to_right )
        {
            dx = (dx ^ s) - s;
            dy = (dy ^ s) - s;
            pt1.x ^= (pt1.x ^ pt2.x) & s;
            pt1.y ^= (pt1.y ^ pt2.y) & s;
        }
        else
        {
            dx = (dx ^ s) - s;
            bt_pix = (bt_pix ^ s) - s;
        }
    //像素位置
        ptr = (uchar*)(img.data + pt1.y * istep + pt1.x * bt_pix0);
    
        s = dy < 0 ? -1 : 0;
        dy = (dy ^ s) - s;
        istep = (istep ^ s) - s;
    
        s = dy > dx ? -1 : 0;
    //交换dx,dy的值
        /* conditional swaps */
        dx ^= dy & s;
        dy ^= dx & s;
        dx ^= dy & s;
    
        bt_pix ^= istep & s;
        istep ^= bt_pix & s;
        bt_pix ^= istep & s;
    //类数据初始化
        if( connectivity == 8 )
        {
            assert( dx >= 0 && dy >= 0 );
    
            err = dx - (dy + dy);
            plusDelta = dx + dx;
            minusDelta = -(dy + dy);
            plusStep = (int)istep;
            minusStep = (int)bt_pix;
            count = dx + 1;
        }
        else /* connectivity == 4 */
        {
            assert( dx >= 0 && dy >= 0 );
    
            err = 0;
            plusDelta = (dx + dx) + (dy + dy);
            minusDelta = -(dy + dy);
            plusStep = (int)(istep - bt_pix);
            minusStep = (int)bt_pix;
            count = dx + dy + 1;
        }
    
        this->ptr0 = img.ptr();
        this->step = (int)img.step;
        this->elemSize = (int)bt_pix0;
    }
    

    其实从上可以看出LineIterator 仅仅是给了Line函数prt值,而prt就是所画直线的位置的像素数据,信息被存在LineIterator 迭代中,用++()进行处理,即:

        for( i = 0; i < count; i++, ++iterator )
        {
            uchar* ptr = *iterator;
            if( pix_size == 1 )
                ptr[0] = color[0];
            else if( pix_size == 3 )
            {
                ptr[0] = color[0];
                ptr[1] = color[1];
                ptr[2] = color[2];
            }
            else
                memcpy( *iterator, color, pix_size );
        }
    

    好了,最后看了代码后又学到了一直效率较高方便的swap函数交换方法,其实上面的代码中已包含,即上面的异或运算,在此再码一下:

    void swap(int a, int b)
    {
    	a = a ^ b;
    	b = a ^ b;
    	a = a ^ b;
    }
    
    展开全文
  • Matlab line函数

    万次阅读 2013-08-28 18:30:51
    matlab line函数  1,比较常见的几种形式  line(X,Y)  line(X,Y,Z)  line(X,Y,Z,'PropertyName',PropertyValue,...)  line('PropertyName',PropertyValue,...) low-level-PN/PV pairs only  h =

    matlab  line函数

       1,比较常见的几种形式

       line(X,Y)
       line(X,Y,Z)
       line(X,Y,Z,'PropertyName',PropertyValue,...)
       line('PropertyName',PropertyValue,...) low-level-PN/PV pairs only
       h = line(...)
    具体用法:
    line([起点横坐标,终点横坐标],[起点纵坐标,终点纵坐标]),
    例line([1,2],[3,4])将画出(1,3)到(2,4)的一条直线,而不是(1,2)到(3,4)。
    当line(a,b)中,a b是相同大小的矩阵时,将会在对应的每一列做一条直线。
    当line(a,b,c)时,相应地会在三维图中画一条线
     当 line('PropertyName',PropertyValue,...)

    展开全文
  • 通过line函数,绘制直线实现 通过rectangle函数,绘制矩形实现 源码如下: #include <opencv2/opencv.hpp> #include <opencv2/imgproc.hpp> #include <iostream> using namespace std; using ...

     1、绘制直方图有两种方法

    • 通过line函数,绘制直线实现
    • 通过rectangle函数,绘制矩形实现

    源码如下:

    #include <opencv2/opencv.hpp>
    #include <opencv2/imgproc.hpp>
    #include <iostream>
    using namespace std;
    using namespace cv;
    
    int main(int argc, char ** argv) {
    	Mat srcImage = imread("1.jpg", 0);
    	if (srcImage.empty()) {
    		printf("could not load this picture!\n");
    		return -1;
    	}
    	//调用calcHist函数,得到直方图数组
    	int bins = 256;
    	int * histsize = &bins;
    	int channel = 0;
    	float hRange[] = { 0, 256 };
    	const float * range = { hRange };
    	MatND histValue;
    	calcHist(&srcImage, 1, &channel, Mat(), histValue, 1, histsize, &range);
    	//归一化处理
    	int hist_w = 256;        //输入图片的宽
    	int hist_h = 256;        //输出图片的高
    	Mat histImage = Mat(hist_h, hist_w, CV_8UC3, Scalar(255, 255, 255));
    	int scale = cvRound(hist_w / bins);    //输入图片的宽与bin的比值,为了下文等距绘制直方图
    	normalize(histValue, histValue, 0, histImage.rows,NORM_MINMAX, -1, Mat());
    	//绘制图像直方图
    	//for (size_t i = 0; i < bins - 1; i++) {
    	//	line(histImage, Point(scale * i, histValue.rows - cvRound(histValue.at<float>(i))), 
    	//		Point(scale * i, histImage.rows - cvRound(histValue.at<float>(i + 1))), Scalar(), 1, LINE_AA);
    	//}
    	//使用矩形绘制图像直方图
        /*
        *    绘制矩形时,需要两个锚点p1和p2
        *    p1是指矩形左下角的点,特征是:x = i, y = 0
        *    p2是指矩形右上角的点,特征是:x = i+1, y = 屏幕的高减去此点的值
        */
    	for (size_t i = 0; i < bins - 1; i++) {
    		rectangle(histImage, Point(scale * i, 0), 
    			Point(scale * (i + 1), histValue.rows - cvRound(histValue.at<float>(i + 1))), Scalar(0, 0, 0), 1, LINE_AA);
    	}
    	imshow("效果图", histImage);
    	imshow("源图像", srcImage);
    	waitKey(0);
    	return 0;
    }

     

    展开全文
  • 之前写程序的时候想把描点的轨迹保存成GIF图,于是在网上找到了用EraseMode属性保留轨迹的方法,但是出了点问题,后来就去学习了一下animatedline函数的用法,做个小笔记 将 EraseMode 属性设置为 ‘none’ 网上学的...

    之前写程序的时候想把描点的轨迹保存成GIF图,于是在网上找到了用EraseMode属性保留轨迹的方法,但是出了点问题,后来就去学习了一下animatedline函数的用法,做个小笔记

    将 EraseMode 属性设置为 ‘none’

    网上学的例子大概就是这样设置画线的属性:

    h=line(NaN,NaN,'marker','o','linesty','-','erasemode','none');
    

    但是我的轨迹并没有画出来,如图:
    在这里插入图片描述
    只有一个点在动,没有轨迹
    不清楚这是我的代码的原因,还是因为:
    网址:https://ww2.mathworks.cn/help/matlab/graphics_transition/how-do-i-replace-the-erasemode-property.html
    我的版本是2016b,MATLAB也有警告:
    在这里插入图片描述
    同样出现上述问题的同学,可以尝试使用animatedline函数画图

    animatedline函数

    clear;clc;clf;
    
    theta = 1*pi*(-1:0.005:1);
    p = 2 - 2.^sin(4*theta);
    [x y] = pol2cart(theta,p);
    axis equal;
    h = animatedline(x(1),y(1),'Marker','.');      %显示出点
    for g=1:length(x)
        addpoints(h,x(g),y(g));
        drawnow;
        frame=getframe(gcf);
        imind=frame2im(frame);
        [imind,cm] = rgb2ind(imind,256);
        if g==1
             imwrite(imind,cm,'test1.gif','gif', 'Loopcount',inf,'DelayTime',0.000001);
        else
             imwrite(imind,cm,'test1.gif','gif','WriteMode','append','DelayTime',0.000001);
        end
    end
    

    在这里插入图片描述
    但是我想要的效果是看到一个点画出运动轨迹,不想看到历史的点,就用了一个笨方法:

    clear;clc;clf;
    
    theta = 1*pi*(-1:0.005:1);
    p = 2 - 2.^sin(4*theta);
    [x y] = pol2cart(theta,p);
    axis equal;
    h1 = animatedline(x(1),y(1),'Marker','o','MaximumNumPoints',1);     %只显示1个新的点
    h2 = animatedline(x(1),y(1),'Marker','none');      %历史的点覆盖掉
    for g=1:length(x)
        addpoints(h1,x(g),y(g));
        addpoints(h2,x(g),y(g));
        drawnow;
        frame=getframe(gcf);
        imind=frame2im(frame);
        [imind,cm] = rgb2ind(imind,256);
        if g==1
             imwrite(imind,cm,'test2.gif','gif', 'Loopcount',inf,'DelayTime',0.000001);
        else
             imwrite(imind,cm,'test2.gif','gif','WriteMode','append','DelayTime',0.000001);
        end
    end
    

    在这里插入图片描述
    分别画点和轨迹,方法笨,但效果还可以
    animatedline具体的属性和方法可以去帮助里查看

    顺便,想问一下路过的大佬们,为什么我把imwrite的最后一个参数改小了,保存的GIF的播放速度还是很慢呢?感觉没有变化

    展开全文
  • 按照下述要求分别实现read_line函数: (a)在开始存储输入字符前跳过空白字符。 (b)在读入第一个空白字符时停止。提示:调用isspace函数来检查字符是否为空白字符。 (c)在读入第一个换行符时停止,然后把换行符...
  • matlab的line函数

    万次阅读 2017-11-08 21:26:46
    line([起点横坐标,终点横坐标],[起点纵坐标,终点纵坐标]), 例line([1,2],[3,4])将画出(1,3)到(2,4)的一条直线,而不是(1,2)到(3,4)。 当line(a,b)中,a b是相同大小的矩阵时,将会在对应的每一列做一条直线。...
  • Matlab中的line函数用法总结

    万次阅读 2019-03-13 10:14:23
    line是画线函数, (1)用法一 line([起点横坐标,终点横坐标],[起点纵坐标,终点纵坐标]), line([1,2],[3,4])将画出(1,3)到(2,4)的一条直线,而不是(1,2)到(3,4)。 运行matlab后得到如下图像: line([1,2],...
  • MATLAB中line函数的用法

    千次阅读 2020-09-01 15:02:56
    line(x,y) f1 = figure; x=[1;1;2]; y=[1;...line(x,y);... 确定了三个点 (1,1)(1,2),(2,1),line就是将这三个点连在一起得到一个折线。line可以将传入的n个点连在一起得到一个折线的函数 ...
  • 你们中的许多人在阅读本教程时可能会认为, 关于简单的Python Print函数并没有发现任何问题, 因为你们所有人都已经开始使用常青的打印Hello, World!示例来学习Python。的确, Python或就任何一种编程语言而言, Print...
  • pl/sql developer中dbms_output.put_line函数可以打印想显示在屏幕上的信息,运用时需要注意几点: 1 必须处于begin ... end; 2 需要先执行set serveroutput on命令,在窗口里显示服务器输出信息。然后屏幕上才能...
  • maltab line函数用法

    千次阅读 2015-11-10 15:06:28
    line([xmin,xmax],[ymin,ymax],'linewidth',4,'color','r') xmin可以大于xmax,y同理 linewidth指定线粗细,color指定颜色
  • Matlab动态作图——animatedline函数

    千次阅读 2020-05-08 00:44:05
    为了改文章作图,不得不整了一个Matlab2018b版本,看新版本特性发现了一个有趣的函数。这里mark一下,省得以后还得用pause去做 别的不说,直接给代码 clc; clear; format long e; h = animatedline; axis([0,4*pi,-...
  • 函数作用:将line 指向的 输入参数: char * line —— 被分析的字符串 char *argv[] —— 每个元素都是一个字符串(char *),用来返回解析结果。这是一个指针数组,一些理解可以参考这里。 返回值: 字符串的个数 ...
  • matlab line函数 直线绘图函数

    千次阅读 2017-03-14 10:53:30
    line([起点横坐标,终点横坐标],[起点纵坐标,终点纵坐标]) line([1,2],[3,4])将画出(1,3)到(2,4)的一条直线,而不是(1,2)到(3,4)。 当line(a,b)中,a b是相同大小的矩阵时,将会在对应的每一列做一条直线。 当...
  • stm32 库文件_line 函数

    2014-01-01 22:21:08
     内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是否能形成内联函数,需要看编译器对该函数定义的具体...
  • opencv学习笔记——cv::line函数详解

    千次阅读 2019-09-21 22:08:11
    void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift...
  • void linerel( int dx, int dy ); void line( int x1, int y1, int x2, int y2 );
  • PC/PG设置网口TCP/IP进行连接PLC时,常出现...函数调用 SRMD_Set(..) 中出现错误 错误:无接口句柄 问题:S7ONLINE Error: SRMD_Set No interface handle? 原因:"C:\Program Files\Common File
  • MFC中MoveToEx函数LineTo函数

    千次阅读 2012-11-11 09:41:03
    MoveToEx函数LineTo函数经常备用来画线,函数原型如下:BOOL MoveToEx( HDC hdc, int x, int y, LPPOINT lpPoint ); BOOL LineTo( HDC hdc, int xEnd, int yEnd );MoveToEx函数LineTo函数要一起使用才能达到画线...
  • 目录1、line函数2、circle函数3、rectangle、Rect函数4、ellipse函数5、polylines函数6、随机初始化颜色7、putText函数总结 1、line函数 line(img,(0,0),(511,511),(255,0,0),5) 这个函数有5个参数,img是图像名称...
  • MoveToEx和LineTo函数

    2016-06-21 06:25:55
    现在的世界流行图形界面...MoveToEx是用来移动当前画笔的位置,LineTo是用来画直线的函数,其实在计算机图形里的直线显示是使用光栅图形学里的原理。   函数MoveToEx和LineTo声明如下: WINGDIAPI BOOL WINA
  • 我在做C语言课程设计,要用line函数画个五子棋盘,可是我折腾了半天,看书上的源代码,连一根线都画不出来 我们的书好像是基于TURBO C的,好坑。 #include "stdafx.h" #include #define SOLID_LINE 0 #define ...
  • Q: MATLAB中plot函数和line函数作用有区别吗? A: 两个函数的格式不同: plot(X,Y,S); % X,Y为坐标,画出一个点,S为其它属性(颜色,点的大小等)。 line([X1 X2],[Y1 Y2],S); %点A(X1,Y1)和点B(X2 Y2)之间画一条...
  • 用 Addr2line函数地址解析为函数名 原文链接:http://www.ibm.com/developerworks/cn/linux/l-graphvis/  Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,594
精华内容 5,437
关键字:

line函数