Origin C中使用OpenCV
Origin对OpenCV进行了包装,因此在Origin C中可以调用OpenCV的相关函数。下面就用OpenCV官网的一个例子来演示怎么在Origin C里调用OpenCV。
1.包含头文件
#include <../OriginLab/opencv.h>
这个头文件其实就是又包含了其它的一些头文件,包括OpenCV的类型相关的、核心的、图像处理的、Origin自己实现的,等等。因此包含这个头文件进来基本可以没压力的调用相关的OpenCV函数了。
2.OpenCV官网文档的例子
https://docs.opencv.org/3.0.0/d4/d70/tutorial_hough_circle.html
在Origin C里的实现如下:
void Origin_Call_OpenCV() { // 定义一个Origin C函数,编译通过可以直接在Origin的Script Window直接运行
string strImageFile = GetFilePath(__FILE__) + "board.jpg"; // 图片路径
CvMat *pImage = cvLoadImageM(strImageFile, CV_LOAD_IMAGE_COLOR); // 导入图片
if (pImage == NULL) { // 导入失败
printf("打开图片失败!");
return;
}
int rows = pImage->rows; // 图片高度
int cols = pImage->cols; // 图片宽度
printf("图片的宽度为%d,高度为%d\n", cols, rows);
ShowImage(pImage); // 在Origin里显示图片
CvMat grayImage;
matrix<byte> matGray(rows, cols); // 灰度图的数据
grayImage = cvMat(rows, cols, CV_8UC1, &matGray[0][0]);
cvCvtColor(pImage, &grayImage, CV_BGR2GRAY); // 转为灰度图
ocvMat ocvmat; // 这个类是Origin定义的
ocvmat.SetFromMat(&grayImage, true); // 把OpenCV的数据放入Origin定义那个类
ocvmat.MedianBlur(5); // 中值滤波
CvMat *pGrayImage = ocvmat.CloneCvMat(); // 克隆Origin定义那个类的数据到OpenCV的数据类,要用cvReleaseMat释放内存
ShowImage(pGrayImage); // 在Origin里显示图片
CvMemStorage *pMemStorage = cvCreateMemStorage(0); // 创建内存
// 霍夫变换算法的参数
double dp = 1;
double minDist = 10;
double param1 = 100;
double param2 = 30;
int minRadius = 1;
int maxRadius = 30;
// 霍夫变换找圆
CvSeq *pSeq = cvHoughCircles(pGrayImage, pMemStorage, CV_HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius);
int total = pSeq->total; // 一共找到多少圆
for (int i = 0; i < total; i++) {
float *p = (float *)cvGetSeqElem(pSeq, i); // p[0], p[1]为圆心,p[2]为半径
CvPoint pt;
pt.x = cvRound(p[0]);
pt.y = cvRound(p[1]);
CvScalar scalar; // e用来设置颜色
scalar = cvScalar(0, 0, 255, 0xff); // BGR=(0, 0, 255),圆的颜色
int thickness = 3; // 线的宽度
int lineType = 16; // LINE_AA,抗锯齿
ocvCircle(pImage, &pt, cvRound(p[2]), &scalar, thickness, lineType); // 画找到的圆
scalar = cvScalar(0, 255, 0, 0xff); // BGR=(0, 0, 255),圆心的颜色
ocvCircle(pImage, &pt, 2, &scalar, thickness, lineType); // 画圆心
}
ShowImage(pImage); // 在Origin里显示图片
string strSavedImage = GetFilePath(__FILE__) + "result.png"; // 结果图路径
cvSaveImage(strSavedImage, pImage); // 把结果图保存到当前文件夹
cvReleaseMat(&pGrayImage); // 释放灰度图数据
cvReleaseMemStorage(&pMemStorage); // 释放内存
cvReleaseMat(&pImage); // 释放原图数据
}
在Origin里显示的结果图为:
导出的结果图为:
源码可于github下载:https://github.com/gkimeeq/OriginAdvancedApplication。