http://blog.sina.com.cn/s/blog_737adf530100z0jk.html
在第一次使用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*)
{
//blur 灰度圖片
blur(gray, edge, Size(3,3));
// Canny 邊緣檢測
Canny(gray,edge, edgeThresh, edgeThresh*3, 3);
//全部設為0
cedge = Scalar::all(0);
//拷貝邊緣的象素點
image.copyTo(cedge, edge);
imshow("Edge map", edge);
}
int main(int argc, char** argv)
{
// 載入圖片
image = imread(argv[1], 1);
// 判斷載入圖片是否成功
if(image.empty())
{
printf("miss the image file: %d \n", argv[1]);
return -1;
}
// 生成灰度圖片,因為只有灰度圖片才能生成邊緣圖片
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.
參見http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=15046&p=59244&hilit=tbb_debug.dll#p59244,按照論壇中所給的網址,下載一個tbb包,將tbb_debug.dll解壓到D:\Program Files\opencv\build\common\tbb\ia32\vc10(這是我的安裝目錄)即可。
錯誤3.
哈哈,代碼結尾多了個},刪掉就好啦。
錯誤4.
編譯都順利通過了,現在一Debugging就發現
很簡單,例程估計用cmd來運行main(),參數在命令行中都敲進去了。直接運行debug電腦發現缺少必要參數肯定不干。仔細看下 int argc, char** argv ,第一個參數發現沒用着,可以直接刪掉。后面是個指向char指針的指針,程序中是用來打開文件用的,這好辦,自己給他在程序中指一個唄:
const char* imagename = "lena.jpg";
// 載入圖片
image = imread(imagename, 1);
// 判斷載入圖片是否成功
if(image.empty())
{
printf("miss the image file: %d \n");
return -1;
}
printf后面的argv[1],沒什么實際作用,刪除。這下程序就跑通了唄,實際效果如下:
其實這些錯誤只要我們認真讀懂錯誤提示,兵來將擋,水來土掩,再加上網絡的資源就能夠很容易解決
期待明天有新進展!!