放假路上几天加上在北京弄了三天FPGA,有一周没更新博客了,昨天终于回到家,今天学点东西写写博客吧,东西很简单不过也算假期之旅的不错开始啊
昨天看豆子的《Qt5学习之路2》的时候发现了一个叫Ribbon的东西,好像是做界面的据说还挺酷的,今天就在网上找了找这方面的东西,发现大部分是官方文档,硬着头皮找了篇文档做了一遍,感觉Ribbon这东西做界面确实很炫酷啊。所以就想何不用它做个Opencv图像处理的小工具呢,放上一些按钮实现最基本的图像处理算法,比如中值滤波,Laplace增强,Canny边缘检测等等,这样以后再用这些算法也省得重写了不是,所以今天中午开始写了个小雏形吧,感觉呢确实很方便,在复习之前基本算法的同时顺手不断完善这个小工具吧!!
今天主要做了图片的加载,和一个Laplace图像增强变换,算是一个测试吧。
这里对程序的一些需要注意的地方做下说明吧。
- Mat、IplImage和CvvImage间的转换
由于2.4.x后Mat的出现,其带来的操作方便,内存分配与释放都是自动执行的一些优点都得到了大家的欢迎,所以对于算法的实现都是基于Mat类型的。但是由于在MFC中通过Opencv显示图片并不是那么简单,而在Opencv2.2中提供的CvvImage类很好的解决了这个问题(2.4.x去掉了这个类,这里我们重新引入了这个类),所以,Mat、CvvImage和IplImage之间的转换就成为了一个很重要的地方,这里对它们三者之间的转换做了一下总结
IplImage -> Mat
Mat::Mat(const IplImage* img, bool copyData=false);/*default copyData=false,与原来的IplImage共享数据,只是创建一个矩阵头*/
例子:
IplImage* iplImg = cvLoadImage("greatwave.jpg", 1);
Mat mtx(iplImg); /* IplImage * -> Mat,共享数据; or : Mat mtx = iplImg;*/
Mat -> IplImage
Mat M
IplImage iplimage = M; /*只创建图像头,不复制数据*/
CvMat -> Mat
Mat::Mat(const CvMat* m, bool copyData=false); /*类似IplImage -> Mat,可选择是否复制数据*/
Mat -> CvMat
例子(假设Mat类型的imgMat图像数据存在):
CvMat cvMat = imgMat;/*Mat -> CvMat, 类似转换到IplImage,不复制数据只创建矩阵头
这段代码是对源图像进行Laplace变换的代码,是放在void CFirstMFC1Doc::OnCanny()执行的,注意这里虽然叫Canny但是做的是Laplace变换,忘记改了不好意思,按钮的Canny也是Laplace变换功能
void CFirstMFC1Doc::OnCanny()
{
// TODO: 在此添加命令处理程序代码
cv::Mat mtx(originImage);
cv::Mat mat_gray;
int kernel_size = 3;
cv::GaussianBlur(mtx , mtx ,cv::Size(3,3),0,0,cv::BORDER_DEFAULT);
cv::cvtColor(mtx, mat_gray,CV_RGB2GRAY);
cv::Mat dst,dstabs;
cv::Laplacian(mat_gray , dst , CV_16S, kernel_size,1,0,cv::BORDER_DEFAULT);
cv::convertScaleAbs(dst,dstabs);
IplImage tempImg = dstabs;
processedImg.CopyOf(&tempImg,-1);
m_openImage = TRUE;
UpdateAllViews(NULL);
}
整个程序参考了微软的示例程序,实现了按钮的使能是失效,以及滚动条放大缩小图片功能, 示例链接,最后加入了Opencv
这是程序截图和完整工程的下载链接,大家可以根据自己的需求来增加功能!