机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com 青春是一场远行,总记不起来时的路。 Tue, 27 Oct 2015 15:30:42 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.1.6 机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com/archives/1489 http://www.youthtribe.com/archives/1489#respond Tue, 27 Oct 2015 15:30:42 +0000 http://www.youthtribe.com/?p=1489 opencv-hbitmap在内存中直接转jgp格式-bmp转jpg

IplImage* CMainFrame::Bitmap2IplImage(HANDLE hBitmap)
{
	BITMAP bmp; // 得到位图对象
	int nPicSize;
	nPicSize = sizeof(BITMAP);
	GetObject(hBitmap, sizeof(BITMAP), &bmp);

	int depth,nChannels;
	if(bmp.bmBitsPixel == 1)//得到图像深度和通道数
	{
		depth=IPL_DEPTH_1U;
		nChannels=1;
	}
	else
	{
		depth=IPL_DEPTH_8U;
		nChannels=bmp.bmBitsPixel/8;
	}
	long	nBuffer = bmp.bmHeight*bmp.bmWidth*nChannels;
	IplImage* pImg = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight), depth, nChannels); //创建图像
	BYTE *pBuffer = new BYTE[nBuffer]; //创建缓冲区
	//GetBitmapBits(hBmp, bmp.bmHeight*bmp.bmWidth*nChannels, pBuffer); //将位图信息复制到缓冲区
	GetBitmapBits((HBITMAP)hBitmap, nBuffer, pBuffer); //将位图信息复制到缓冲区
	memcpy(pImg->imageData, pBuffer, nBuffer);//将缓冲区信息复制给IplImage
	delete [] pBuffer;//防止内存泄露
	//cvSaveImage("kkk.jpg",pImg,0);
return pImg;
}

]]>
http://www.youthtribe.com/archives/1489/feed 0
机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com/archives/1094 http://www.youthtribe.com/archives/1094#respond Tue, 11 Mar 2014 02:52:21 +0000 http://www.youthtribe.com/?p=1094 opencv 如何捕捉异常

try{
	//故意出错
}
catch(cv::Exception& e )
{
        const char * s_ERROR=e.what();
        AfxMessageBox(s_ERROR);
}
]]>
http://www.youthtribe.com/archives/1094/feed 0
机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com/archives/1005 http://www.youthtribe.com/archives/1005#comments Thu, 07 Nov 2013 11:18:03 +0000 http://www.youthtribe.com/?p=1005 因为opencv不支持阿尔法通道(也有的说最新版本的其实是支持了的,在此我不做肯定),但要是两张图片去叠加的话,其实还是可以简单实现透明叠加的,这也是制作水印图片的方法。
比如,我们把图片B叠加到图片A上.透明的实际效果就是既能看到A的内容,又能看到B的内容.

终值 = Va*(1-rank/10)+Vb*(rank/10)

///下边是关键代码,有注释

//先说一下,pimg是大图(也可以理解为背景图),watermarkpic是水印图片(你的水印logo,或者文字),是IplImage格式指针
//注意数组的越界问题,水印图片要比pimg的小才行的。如果大了,就缩小一下就可以了


		//把水印图片的像素值写到pImg的ROI中
		CvScalar scalar1,scalar2,scalar3;
		//透明度参数
		double dbAlpha;
                //1-10,0为不透明,10为透明(也就是不显示水印图片),所以实际值为1-9
		dbAlpha = 2;
		for (int i=0;iheight;i++)
		{
			for (int j=0;jwidth;j++)
			{
				//得到水印图片对应的值
				//这其实也可以设置一下透明度的 hyaline
				//scalar=cvGet2D(watermarkpic,i,j);//这行是完全不透明的语句
				scalar1 = cvGet2D(watermarkpic,i,j);//水印图片像素值
				scalar2 = cvGet2D(pImg,i,j);//pimg像素值
				for (int k =0;k<4;k++)
				{
                                        //开始赋值,也就是合成后图片对应的像素值
					scalar3.val[k] = scalar1.val[k]*(1-dbAlpha)+scalar2.val[k]*dbAlpha;

				}

				cvSet2D(pImg,i,j,scalar3);

			}
		}

下边附3张效果图:

opencv叠加透明效果图

opencv叠加透明效果图

opencv叠加透明效果图

最后,感谢美女范冰冰小姐的友情客串.
ps:图片来自截屏软件,就有添加透明水印的效果哦,可自定义水印位置哈:http://www.youthtribe.com/snapshot/

]]>
http://www.youthtribe.com/archives/1005/feed 1
机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com/archives/925 http://www.youthtribe.com/archives/925#respond Sun, 14 Jul 2013 05:59:51 +0000 http://www.youthtribe.com/?p=925 先上定义:

Dilate

使用任意结构元素膨胀图像

void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
src
输入图像.
dst
输出图像.
element
用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations
膨胀的次数

函数 cvDilate 对输入图像使用指定的结构元进行膨胀,该结构决定每个具有最小值象素点的邻域形状:

dst=dilate(src,element):  dst(x,y)=max((x',y') in element))src(x+x',y+y')

函数支持(in-place)模式。膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。

 

下边是程序:

// opencv_template.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h"
#include "opencv2/opencv.hpp"; 
#include "opencv/cv.h";

using namespace std; 
using namespace cv;

int _tmain(int argc, _TCHAR* argv[]) {  
//cout"""iam a boy"""endl;  
IplImage *img;  img=cvLoadImage("test.jpg",1);  
IplImage *newimg;  
newimg = cvCloneImage(img);

//开始膨胀  
cvDilate(img,newimg,NULL,3);  
//开始腐蚀  
//cvErode(img,newimg,NULL,3);

//开始显示图片  
cvNamedWindow("DilateBefore",CV_WINDOW_AUTOSIZE);  
cvNamedWindow("DilateAfter",CV_WINDOW_AUTOSIZE);  
cvShowImage("DilateBefore",img);  
cvSaveImage("new.jpg",newimg);  
cvShowImage("DilateAfter",newimg);  
cvWaitKey(0);  
//system("pause");  
return 0; 
}

 

 

]]>
http://www.youthtribe.com/archives/925/feed 0
机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com/archives/916 http://www.youthtribe.com/archives/916#respond Wed, 10 Jul 2013 14:06:51 +0000 http://www.youthtribe.com/?p=916 1.单击 项目 ,-〉你的工程名+属性-〉配置属性-〉VC++目录

在右侧显示的 常规中包含目录中 添加:你的opencv安装目录 \opencv2.4.4\opencv\build\include,你的opencv安装目录 \opencv2.4.4\opencv\build\include\opencv,你的opencv安装目录 \opencv2.4.4\opencv\build\include\opencv2,这三项

在库目录中添加 :

你的opencv安装目录opencv2.4.4\opencv\build\x86\vc10\lib

2在链接器-〉输入,右侧 附加依赖项 添加如下:

opencv_calib3d244d.lib opencv_contrib244d.lib opencv_core244d.lib opencv_features2d244d.lib opencv_flann244d.lib opencv_gpu244d.lib opencv_highgui244d.lib opencv_imgproc244d.lib opencv_legacy244d.lib opencv_ml244d.lib opencv_objdetect244d.lib opencv_ts244d.lib opencv_video244d.lib

(这些lib要成一行一行的加, 不然会有LINK : fatal error LNK1104: 无法打开文件”.obj”这个错误)

(注:最后带d的lib适合debug,244实际上是版本,为了方便调试 和发布,所以最好都添加吧)

3.在需要用到opencv的cpp文件中加入:

#include <opencv2/opencv.hpp>

#include <opencv/cv.h>

 

ok。这样好像就可以了。只适用于vc2010 之 cv++

]]>
http://www.youthtribe.com/archives/916/feed 0
机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com/archives/913 http://www.youthtribe.com/archives/913#comments Wed, 10 Jul 2013 13:49:41 +0000 http://www.youthtribe.com/?p=913 先来看opencv函数 cvHoughCircles 的说明:

函数:CvSeq *cvHoughCircles(CvArr *image,void *circle_storage,int method,double dp,double min_dist,double param1,double param2,int min_radius,int max_radius)

下边是参数说明:

image:输入8bit(灰度)图像,其内容可被函数所改变
circle_storage:检测到的圆存储仓,可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回)或者是包含圆参数的特殊类型的具有单行/单列的CV_32FC3型矩阵(CvMat*). 矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的圆。如果 circle_storage 是矩阵,而实际圆的数目超过矩阵尺寸,那么最大可能数目的圆被返回,每个圆由三个浮点数表示:圆心坐标(x,y)和半径.).
method:Hough 变换方式,目前只支持CV_HOUGH_GRADIENT, which is basically 21HT, described in [Yuen03].
dp:寻找圆弧圆心的累计分辨率,这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。
min_dist:该参数是让算法能明显区分的两个不同圆之间的最小距离。
param1:用于Canny的边缘阀值上限,下限被置为上限的一半。
param2:累加器的阀值。
The second method-specific parameter. In case of CV_HOUGH_GRADIENT it is accumulator threshold at the center detection stage. The smaller it is, the more false circles may be detected. Circles, corresponding to the larger accumulator values, will be returned first.
min_radius:最小圆半径。
max_radius:最大圆半径。
]]>
http://www.youthtribe.com/archives/913/feed 1
机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com/archives/898 http://www.youthtribe.com/archives/898#respond Sat, 08 Jun 2013 13:23:52 +0000 http://www.youthtribe.com/?p=898 opencv之边缘检测

// 边缘检测-canddy.cpp : 定义控制台应用程序的入口点。

//

 

#include “stdafx.h”

 

 

/**************************************************

* C++ Canny:Canny边缘检测

**************************************************/

 

/***********************************************************************

* OpenCV example

* By Min Qi February 26, 2012, Indianapolis, IN

***********************************************************************/

 

#include <opencv2/opencv.hpp>

#include <opencv/cv.h>

 

using namespace cv;

//#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);

image = imread(“test.jpg”, 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;

}

 

]]>
http://www.youthtribe.com/archives/898/feed 0
机器视觉&OPENCV – 青春部落,流年似水 http://www.youthtribe.com/archives/895 http://www.youthtribe.com/archives/895#respond Fri, 07 Jun 2013 14:35:00 +0000 http://www.youthtribe.com/?p=895 以后争取每天实验一个opencv代码吧,这样以后就可以直接复制这些代码了

opencv之roi示例

IplImage * test;
test = cvLoadImage(“2.jpg”);
cvNamedWindow(“哈哈”,CV_WINDOW_AUTOSIZE );
cvShowImage(“哈哈”,test);
//设置一下感兴趣区域,并且显示出来roi
cvSetImageROI(test,(cvRect)(1,1,200,200));
cvNamedWindow(“ROI”,CV_WINDOW_AUTOSIZE );
cvShowImage(“ROI”,test);
//设置一下感兴趣通道,并且显示出来coi
cvResetImageROI(test);
cvSetImageCOI(test,0);
cvNamedWindow(“COI”,CV_WINDOW_AUTOSIZE );
cvGetImageCOI(test);
cvShowImage(“COI”,test);

]]>
http://www.youthtribe.com/archives/895/feed 0