資源簡介
C語言實現梯度的計算,速度比opencv快,效率高,可移植性強,代碼的閱讀性好,圖像處理與c語言的有效結合
代碼片段和文件信息
實現1(完全借助OpenCV的函數,較慢):
#include?“stdafx.h“
#include?“highgui.h“
#include?“cv.h“
?
void?Soble(IplImage?*imgIplImage*?gradientImage)
{
?????????IplImage*?H?=?cvCreateImage(cvGetSize(img)?321);
?????????IplImage*?V?=?cvCreateImage(cvGetSize(img)?321);
?????????IplImage*?HV?=?cvCreateImage(cvGetSize(img)?321);
?
?????????//both?horizontal?and?vertical?gradient
?????????cvSobel(imgH013);??
?????????cvSobel(imgV103);
?
?????????//total?gradient?=?sqrt(horizontal*horizontal+vertical*vertical)
?????????int?ij;
?????????double?v1v2v;
?????????for?(i=0;iheight;i++)
????????{
??????????????????for?(j=0;jwidth;j++)
???????????????????{
????????????????????????????v1?=?cvGetReal2D(Hij);
????????????????????????????v2?=?cvGetReal2D(Vij);
????????????????????????????v?=?sqrt(v1*v1+v2*v2);
?
????????????????????????????cvSetReal2D(HVijv);
???????????????????}
????????}
?????????cvNormalize(HVgradientImage0255CV_MINMAX0);
?
?????????cvReleaseImage(&H);
?????????cvReleaseImage(&V);
?????????cvReleaseImage(&HV);
}
int?_tmain(int?argc?_TCHAR*?argv[])
{
?????????IplImage?*?img?=?cvLoadImage(“1.jpg“1);
?????????IplImage?*grayImage?=?cvCreateImage(cvGetSize(img)?8?1);
?????????IplImage?*gradientImage?=?cvCreateImage(cvGetSize(img)81);
?
?????????cvCvtColor(img?grayImage?CV_BGR2GRAY);??//?color?to?gray
?
?????????double?t?=?cvGetTickCount();
?????????Soble(grayImagegradientImage);??
?????????t?=?(cvGetTickCount()-t)/1000000;
?????????printf(“time:?%4.4f\n“?t);
?
?????????cvNamedWindow(“grayImage“1);
?????????cvShowImage(“grayImage“grayImage);
?????????cvNamedWindow(“gradientImage“1);
?????????cvShowImage(“gradientImage“gradientImage);
?
?????????cvWaitKey(0);
?????????cvReleaseImage(&img);
?????????cvReleaseImage(&grayImage);
?????????cvReleaseImage(&gradientImage);
?????????return?0;
}
?
效果圖如下:
???
實現2(借助指針,較快):?
#include?“stdafx.h“
#include?“highgui.h“
#include?“cv.h“
?
int?FastSobel(unsigned?char?*in?int?width?int?height?int?widthStep
???????????????????????????????unsigned?char?*edg?unsigned?char?*ang)
{
?????????int?ij;
?
?????????unsigned?char?*inPtr?=?NULL;
?????????unsigned?char?*inPtr1?=?NULL;
?????????unsigned?char?*inPtr2?=?NULL;
?????????unsigned?char?*inPtr3?=?NULL;
?????????unsigned?char?*inPtr4?=?NULL;
?????????unsigned?char?*inPtr5?=?NULL;
?????????unsigned?char?*inPtr6?=?NULL;
?
?????????int?*pEdgeX?=?(int?*)calloc(width*height?sizeof(int));
?????????int?*pEdgeY?=?(int?*)calloc(width*height?sizeof(int));
?????????int?*pEdgeXPtr?=?NULL;
?????????int?*pEdgeYPtr?=?NULL;
?
?????????unsigned?char?*angPtr?=?NULL;
?????????unsigned?char?*edgPtr?=?NULL;
?
?????????//?this?is?heuristic?and?it?should?add?receptive?area
?????????i
- 上一篇:C語言超市收銀模擬系統
- 下一篇:c++ http并保存到本地
評論
共有 條評論