opencv中CvSeq的取点用法

本人小菜,哈哈哈

最近用Opencv中的查找边缘函数:int cvFindContours(  CvArr* image, 

CvMemStorage* storage, 

CvSeq** first_contour,

int header_size=sizeof(CvContour),

int mode=CV_RETR_LIST,

int method=CV_CHAIN_APPROX_SIMPLE, 

CvPoint offset=cvPoint(0,0) ); 

学习了关于里面CvSeq结构的用法,CvSeq结构在Opencv中的源码如下面所示:

    #define CVgSEQUENCE\_FIELDS() \
    int flags; /* micsellaneous flags */ \
    int header_size; /* 序列头的大小 */ \
    struct CvSeq* h_prev; /* 前一个序列 */ \
    struct CvSeq* h_next; /* 后一个序列 */ \
    struct CvSeq* v_prev; /* 第二级前一个序列 */ \
    struct CvSeq* v_next; /* 第二级后一个序列 */ \

    #define CV_SEQUENCE_FIELDS()                                              \
    CV_TREE_NODE_FIELDS(CvSeq);                               

    int total; /* 元素的总个数 */ \
    int elem_size;/* 元素的尺寸 */ \
    char* block_max;/* 上一块的最大块 */ \
    char* ptr; /* 当前写指针 */ \
    int delta_elems; /*序列中快的大小
                        (序列粒度) */
 \
    CvMemStorage* storage; /*序列的存储位置 */ \
    CvSeqBlock* free_blocks; /* 未分配的块序列 */ \
    CvSeqBlock* first; /* 指向第一个快序列 */

    typedef struct CvSeq
  {
       CV_SEQUENCE_FIELDS()
  }
  CvSeq;

要取CvSeq结构体中的点可用:

CvPoint *pt1;

int num; /* 指向结构体CvSeq的序号 */

pt1 = (CvPoint*)cvGetSeqElem(cont, num);

于是,取CvSeq弧的两端点与中间点分别为:

cur_uint->Point1    = (CvPoint*)cvGetSeqElem(cont, 0);

cur_uint->Point2    = (CvPoint*)cvGetSeqElem(cont, total/2);
cur_uint->Point3    = (CvPoint*)cvGetSeqElem(cont, total);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java使用OpenCV绘制,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Java的OpenCV库,并将其正确配置到你的项目。 2. 导入所需的类和方法: ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgproc.Imgproc; import org.opencv.highgui.HighGui; ``` 3. 在代码加载图像并创建一个Mat对象: ```java Mat image = Imgcodecs.imread("path/to/your/image.jpg"); ``` 4. 创建一个Point对象来表示你想要绘制的的坐标: ```java Point point = new Point(x, y); ``` 5. 使用Scalar对象定义的颜色: ```java Scalar color = new Scalar(0, 0, 255); // BGR颜色 ``` 6. 调用OpenCV的绘制函数,在图像上绘制: ```java Imgproc.circle(image, point, 5, color, -1); // 绘制一个半径为5的实心圆 ``` 7. 最后,显示绘制好的图像: ```java HighGui.imshow("Image with Point", image); HighGui.waitKey(0); ``` 完整的代码示例如下: ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.Point; import org.opencv.core.Scalar; import org.opencv.core.Size; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.highgui.HighGui; import org.opencv.imgproc.Imgproc; public class DrawPointExample { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat image = Imgcodecs.imread("path/to/your/image.jpg"); Point point = new Point(100, 100); Scalar color = new Scalar(0, 0, 255); Imgproc.circle(image, point, 5, color, -1); HighGui.imshow("Image with Point", image); HighGui.waitKey(0); } } ``` 记得将"path/to/your/image.jpg"替换为你的实际图像的路径。这段代码将在图像上绘制一个红色的,并显示结果图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值