在第一次使用opencv程式成功對影象進行開啟後,現在開始試驗第二個例程試驗:canny邊緣檢測
這裡演算法原理和具體程式設計語句都先不管,因為作為一名新手(反正我是這麼感覺的),拿些現成的程式跑出效果才是讓人很有feel的。
先貼下原**:
#include "cv.hpp"
#include "cxcore.hpp"
#include "opencv2\highgui\highgui.hpp"
using namespace cv;
using namespace std;
int edgethresh = 1;
// 宣告 原始,灰度,和 canny邊緣
mat image, cedge;
mat gray, edge;
void ontrackbar(int, void*)
int main(int argc, char** argv)
// 生成灰度,因為只有灰度才能生成邊緣
cedge.create(image.size(), image.type());
cvtcolor(image,gray, cv_bgr2gray);
//新建乙個視窗
namedwindow("edge map", 1);
// 生成乙個進度條來控制邊緣檢測
createtrackbar("canny threshold", "edge map", &edgethresh, 100, ontrackbar);
//初始化影象
ontrackbar(0,0);
waitkey(0);
return 0;
}}這個是opencv中文論壇上的源**c++版本,木有一點改動。但是出現以下錯誤:
錯誤1.
1>d:\program files\microsoft visual studio 10.0\my project\opencv\test\test2\test2.cpp(72): fatal error c1010: 在查詢預編譯頭時遇到意外的檔案結尾。是否忘記了向源中新增「#include "stdafx.h"」?
1>
1>生成失敗。
這個錯誤很好解決的了,因為使用預編譯,卻沒有找到標準標頭檔案:stdafx.h,雖然我們真的不需要用它,但是為了方便加上該語句就好了。
錯誤2.
參見
錯誤3.
哈哈,**結尾多了個},刪掉就好啦。
錯誤4.
編譯都順利通過了,現在一debugging就發現
很簡單,例程估計用cmd來執行main(),引數在命令列中都敲進去了。直接執行debug電腦發現缺少必要引數肯定不幹。仔細看下 int argc, char** argv ,第乙個引數發現沒用著,可以直接刪掉。後面是個指向char指標的指標,程式中是用來開啟檔案用的,這好辦,自己給他在程式中指乙個唄:
// 載入
image = imread(imagename, 1);
// 判斷載入是否成功
if(image.empty())
printf後面的argv[1],沒什麼實際作用,刪除。這下程式就跑通了唄,實際效果如下:
其實這些錯誤只要我們認真讀懂錯誤提示,兵來將擋,水來土掩,再加上網路的資源就能夠很容易解決
期待明天有新進展!!
opencv的Canny邊緣檢測
前言 目標 去噪 邊緣對雜訊敏感,第一步先用高斯濾波器來濾波。尋找影象的密度梯度 對平滑後的影象進行濾波用sobel濾波器來求出x,y方向的導數。梯度方向總是垂直於邊緣 非極大值抑制 在得到梯度的值和方向後,對影象進行全面掃瞄,取出不需要的畫素,這些畫素可能不構成邊緣。對於這一點如果畫素是其梯度方向...
OpenCV中Canny邊緣檢測
具體的canny邊緣檢測原理 1 消除雜訊,使用高斯平滑濾波器卷積降噪 2 計算梯度幅值和方向。利用sobel濾波器。得到x和y方向的導數gx和gy 計算梯度的幅值和方向 g sqrt gx 2 gy 2 a arctan gx gy 梯度的方向近似到四個可能角度之一 一般0,45,90,135 3...
OpenCV的Canny邊緣檢測
步驟 平滑處理 梯度檢測 非極大值抑制 滯後閾值處理 1.所有的邊緣都極易受到雜訊的干擾,為了防止因雜訊引起的錯誤檢測結果,有必要用平滑濾波的方法濾除雜訊。高斯濾波是常用的濾波方式,二維影象用二維高斯函式,它的定義為 ps 表示高斯函式的標準差 邊緣檢測之前,先用gaussianblur函式進行高斯...