2016-11-27 12:48:37 liumangmao1314 阅读数 11238
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4124 人正在学习 去看看 贾志刚

opencv中对Mat类型图像感兴趣(ROI)轮廓外接矩形并截取保存结果

最近自己在用opencv做图像实验时,要对轮廓外接矩形,网上大多是对IplImage类型图像做处理,而现在opencv中Mat取代了IplImage类型的图像,IplImage类型存储比Mat类型复杂,而且不如Mat类型图像访问方便,比如IplImage类型图像访问每个点的像素时,要计算步长如srcimage->imageData[i+j*srcimage->widthStep],看起来就很是繁琐,Mat类型图像srcimage.at<uchar>(i,j)即可,很方便。
话不多说,进入正题。

IplImage类型的图像用cvSetImageRIO()函数即可,具体使用代码如下:

cvSetImageROI(frame,((CvContour*)c)->rect);//frame为源图像,((CvContour*)c)->rect就是CvSeq *c;
Mat类型图像处理如下:
大致步骤:
1、用findContours()检测轮廓,具体参数可以上百度或借阅资料参考;
2、用approxPolyDP()求出多边形近似,参数如下的代码;
3、利用boundingRect()得到每个轮廓外接矩形的数据结构信息,存在boundRect[i]中;
4、image(boundRect[i])得到每个轮廓外接矩形的结果图像,可以存储到指定文件夹。
具体看代码(一些主要语句):
//轮廓检测  
    cv::vector<vector<Point>> contours;//定义轮廓集合  
    cv::vector<Vec4i> hierarchy;  
    cv::findContours(thinDoublexy,contours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));//thinDoublexy为需要查找轮廓的图像,其他参数借阅资料。  
    Mat drawing=Mat::zeros(thinDoublexy.size(),CV_8UC3);  
    cv::vector<vector<Point>> conpoint(contours.size());  
    cv::vector<Rect> boundRect(contours.size());  
    for(int i=0;i<contours.size();i++)  
    {  
        approxPolyDP(Mat(contours[i]),conpoint[i],3,true);//多边形近似  
        boundRect[i]=boundingRect(Mat(conpoint[i]));//得到轮廓外接矩形数据结构  
        cv::drawContours(drawing,contours,i,255,2,8,hierarchy,0,Point());//画出轮廓得到图像drawing  
        if(boundRect[i].area()>4) //有些轮廓就是一个点,要舍去  
        {  
            cv::Mat imageROI=image(boundRect[i]);//根据轮廓外接矩形信息进行截取RIO感兴趣部分图像  
            std::stringstream ss;//int转换为string  
            std::string str;  
            ss<<i;  
            ss>>str;
	 string tempname = pathWrite+"\\" + str + "result.jpg";<span style="font-family: Arial, Helvetica, sans-serif;">//pathWrite变量是文件夹路径 
            imwrite(tempname.c_str(),imageROI);//存储图像至指定文件夹  
            //cout<<tempname<<endl;  
            //imshow(tempname,imageROI);  
        }  
    }
上述代码亲测有效,运行结果如下,只是我做一下说明:代码是部分代码,只是实现Mat类型图像的轮廓外接矩形并保存结果图像的功能,要想代码跑起来,肯定需要加一些定义部分的代码。我自己也是初学者,如果你发现不对的地方,敬请指正,谢谢!

运行结果:

源图像


运行结果

2018-08-28 09:00:36 qq_36509928 阅读数 1252
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4124 人正在学习 去看看 贾志刚

MFC显示图像到界面,可以用链接中的DrawMatToPic,有时会出现IplImage*类型转换问题,因为用opencv做后续图像处理,所以统一使用Mat类型,可以showMat()函数进行显示。在MFC中嵌入opencv窗口”view”后,其他地方调用imshow(”view“,图像名)。

int Ctest2Dlg::ShowMat(cv::Mat img, HWND hWndDisplay)
{
    if (img.channels()<3)`
    {
        return -1;
    }

    //构造将要显示的Mat版本图片
    RECT rect;
    ::GetClientRect(hWndDisplay, &rect);
    cv::Mat imgShow(abs(rect.top - rect.bottom), abs(rect.right - rect.left), CV_8UC3);
    resize(img, imgShow, imgShow.size());

    //在控件上显示要用到的CImage类图片
    ATL::CImage CI;
    int w = imgShow.cols;//宽  
    int h = imgShow.rows;//高  
    int channels = imgShow.channels();//通道数  
    CI.Create(w, h, 8 * channels);

    //CI像素的复制
    uchar *pS;
    uchar *pImg = (uchar *)CI.GetBits();//得到CImage数据区地址  
    int step = CI.GetPitch();
    for (int i = 0; i<h; i++)
    {
        pS = imgShow.ptr<uchar>(i);
        for (int j = 0; j<w; j++)
        {
            for (int k = 0; k<3; k++)
                *(pImg + i*step + j * 3 + k) = pS[j * 3 + k];
            //注意到这里的step不用乘以3  
        }
    }

    // TODO: 在此添加额外的初始化代码
    //在控件显示图片
    HDC dc;
    dc = ::GetDC(hWndDisplay);
    CI.Draw(dc, 0, 0);
    ::ReleaseDC(hWndDisplay, dc);
    CI.Destroy();
    return 0;
}

DrawMatToPic ——–在mfc的图形控件嵌入opencv的图形窗口 - CSDN博客 https://blog.csdn.net/pengjc2001/article/details/52073868
showMat()函数摘自 http://lib.csdn.net/article/opencv/33270

2019-08-03 21:42:13 baidu_24565387 阅读数 1034
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4124 人正在学习 去看看 贾志刚

OpenCV中Mat类型与C#中Bitmap类型的转换

OpenCV类型中图像的处理

	readImage = imread(imgpath, IMREAD_GRAYSCALE);
	threshold(readImage,outputImage, 0, 255, THRESH_BINARY | THRESH_OTSU);
	tmp =	outputImage.clone();
	uchar*  imgdata = new uchar[tmp.rows*tmp.cols * 3];
	imgdata = tmp.data;
	width = tmp.size().width;
	height = tmp.size().height;
	step = tmp.step;
	data = imgdata;

关键点:最后的data数据类型为uchar*& 类型,定义如下:
char*& data;
若是只定义为char*类型,则只指向了图像头部指针,在外层调用时为空。

C#类型中图像的处理

[DllImport("XXXXXXXX.dll")]
public static extern void Run(string imgpath, out int width, out int height, out int step,out IntPtr data);
//运行方法
IntPtr imgData;
Run(imgPath,out width,out height,out step,out imgData);
Bitmap bmp = new Bitmap(width, height, step, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, imgData);
bmp.Save("D:/0803.bmp");

关键点:函数参数的定义,定义为引用的指针。

2018-06-30 22:01:25 webzhuce 阅读数 139
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4124 人正在学习 去看看 贾志刚

OpenCV Mat类

  无论什么数字图像处理,最基本的操作对象是图像的基本元素,即像素。Mat类是OpenCV中基础图像容器类。从根本上来说,一张图像是一个由数值组成的矩阵。这也是OpenCV2用cv::Mat这个数据结构来表示图像的原因。矩阵的每一个元素代表一个像素。对于灰度图像(仅包含“灰色”的图像)而言,像素由8位无符号数来表示,其中0代表黑色,255代表白色。对于彩色图像而言,每个像素需要三个这样的8位无符号来表示三个颜色通道(RGB-红、绿、蓝)。因此,在这种情况下矩阵的元素是一个三元数。
Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但是矩阵本身的尺寸会依图像的不同而不同。矩阵由宽度(width)、高度(height)、类型(tpye),行数据长度(step)和一个指向数据的指针构成。

创建Mat对象

  Mat不但是一个非常有用的图像容器类,同时而是一个通用的矩阵类。创建一个Mat对象有很多种方法。下面是使用Mat的构造函数,

Mat m(2, 2 , CV_8UC3, Scalar(0, 0, 255));
std::cout<<"m = "<<std::endl<<m<<std::endl;

这里写图片描述
  对于二维多通道图像,首先要定义其尺寸,即行数和列数。然后需要指定存储元素的数据类型以及每个矩阵点的通道数。定义规则:

CV_[维数][带符号与否][类型前缀]C[通道数]。另外,Scalar是个short类型的向量。

比如CV_8UC3表示使用8位的unsigned char类型,每个像素由三个元素组成三通道。
  Mat类实现了引用计数以及浅拷贝,当图像之间进行幅值时,图像数据并没有发生复制,两个对象都指向同一块内存块。这也可用于参数传值的图像,以及返回值传值的图像。引用计数的作用是当且仅当所有引用内存数据的对象都被析构后,才会释放内存块。如果你希望创建的图像拥有原始图像的崭新拷贝,那么可以使用copyTo()方法或clone()。

Mat和IplImage

   OpenCV 2引入了崭新的C++接口。之前使用的C函数和数据库任何可以使用,其中图像是通过IplImage进行操作,该类继承自IPL库,即英特尔图像处理库(Intel Image Processing Library),现在已整合进IPP库即英特尔综合性能库(Intel Integrated Performance Primitive Library)。如果你使用老式的C风格接口,那么你需要操作IplImage结构。幸运的是,可以方便地转换一个IplImage到cv::Mat对象。

IplImage* iplImage = cvLoadImage(“C:\\img.jpg”);
cv::Mat image(iplImage, false);

   cvLoadImage是一个C风格的图像读取函数。cv::Mat对象构造函数中的第二个参数说明不需要进行数据拷贝(设true意味着得到崭新的拷贝,默认值为false)。我们应该尽量避免使用这个被废弃的数据结构,而是使用cv::Mat。

2019-05-30 00:09:16 matt45m 阅读数 305
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4124 人正在学习 去看看 贾志刚

前言

在机器学习和深度学习的时候,对图像进行处理时,会遇到明明是给的三通道的图像,但因为是黑白的,程序判断为单通道的图像,这样让人很无语,还有有时候有些库必须要传入三通道的RGB图像,但为了提升处理的速度,我们就已经在别的地方做比如边缘检测啊,外部轮廓提取等操作,此时的图像已经是单通道Mat,为了使用处理好的单通道Mat,可以写个函数把单通道的Mat强行转换成三通道的Mat。

Mat类型转换

Mat channelSwitching(const Mat& src)
{
    Mat three_channel = Mat::zeros(src.rows,src.cols,CV_8UC3);
    vector<Mat> channels;
    if(src.channels() == 0)
    {
        for (int i=0;i<3;i++)
        {
            channels.push_back(src);
        }
        merge(&channels[0], channels.size(), three_channel);
    }
    
   return three_channel; 
}

转换的结果也是得到一张黑白图像,但此时已经是三通道的黑白图像了,意思就是把程序给骗过去而已。

没有更多推荐了,返回首页