• 【OpenCV学习笔记4】OpenCV GUI 之VCWin32+OpenCV 实现细胞计数


    OpenCV GUI 之VC WIn32+OpenCV 实现细胞计数

    SkySeraph Mar 19th 2011  HQU

    Email:zgzhaobo@gmail.com    QQ:452728574

    Latest Modified Date:Mar 19th 2011 HQU

    1 #include "iostream"
    2  using namespace std;
    3
    4 #include "highgui.h"
    5 #include "cv.h"
    6
    7  #pragma comment(lib,"cv.lib")
    8  #pragma comment(lib,"cxcore.lib")
    9 #pragma comment(lib,"highgui.lib")
    10
    11 /*------------------------------------------------------------------*/
    12
    13 int main(int argc,char **argv)
    14 {
    15
    16 /*-------------------------------------------//
    17 //功能:载入图像
    18 //原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
    19 //参数:
    20 flags:指定读入图像的颜色和深度,指定的颜色可将输入图像转换为以下三种格式
    21 3通道(CV_LOAD_IMAGE_COLOR)也即彩色(>0),
    22 单信道 (CV_LOAD_IMAGE_GRAYSCALE)也即灰色(=0),
    23 保持不变(CV_LOAD_IMAGE_ANYCOLOR)(<0)
    24 深度指定输入的图像是否转为每个颜色信道每象素8位
    25 如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR
    26 //-------------------------------------------*/
    27 char * fileName = argc == 2 ? argv[1] : (char *)"rice.png"; //"lena.jpg";
    28 IplImage * src =0;
    29 // 原色彩
    30 src=cvLoadImage(fileName,-1);
    31 // 3通道
    32 // src=cvLoadImage(fileName,1);
    33 // 灰度
    34 // src=cvLoadImage(fileName,0);
    35 //
    36 if (!src)
    37 {
    38 cout<<"Could not load image file!"<<endl;
    39 return -1;
    40 //exit(0);
    41 }
    42
    43 /*-------------------------------------------//
    44 //功能:创建窗口
    45 //原型:int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE );
    46 //参数:CV_WINDOW_AUTOSIZE为1,表示窗口自动调整以适合图像
    47 为0时,表示自动按上一次使用的窗口尺寸
    48 //-------------------------------------------*/
    49 cvNamedWindow("src",1);
    50 cvNamedWindow("dst",1);
    51
    52 /*-------------------------------------------//
    53 //功能:改变窗口大小
    54 //原型:void cvResizeWindow( const char* name, int width, int height );
    55 //参数:\\
    56 //-------------------------------------------*/
    57 cvResizeWindow("src",512,512);
    58 cvResizeWindow("dst",512,512);
    59
    60 /*-------------------------------------------//
    61 //功能:移动窗口,不重叠
    62 //原型:void cvMoveWindow( const char* name, int x, int y );
    63 //参数:x、y:窗口左上角的x、y坐标
    64 //-------------------------------------------*/
    65 cvMoveWindow("src",0,0);
    66 cvMoveWindow("dst",200,200);
    67
    68 /*-------------------------------------------//
    69 //功能:指定窗口中显示图像
    70 //原型:void cvShowImage( const char* name, const CvArr* image );
    71 //-------------------------------------------*/
    72 cvShowImage("src",src);
    73
    74 /*-------------------------------------------//
    75 //功能:保存图像
    76 //原型:int cvSaveImage( const char* filename, const CvArr* image );
    77 //参数:图像格式的的取决于扩展名
    78 //-------------------------------------------*/
    79 cvSaveImage("rice.jpg",src);
    80 cvSaveImage("rice.bmp",src);
    81
    82 /*-------------------------------------------//
    83 //功能:图像反转
    84 //说明:仅是测试用
    85 //-------------------------------------------*/
    86 // 定义工作位图
    87 IplImage * dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
    88 cvCopy(src,dst); //dst已经创建
    89 // 获取图像信息
    90 int height,width,step,channels;
    91 uchar * data;
    92 height=dst->height;
    93 width=dst->width;
    94 step=dst->widthStep;//排列的行字节数
    95 channels=dst->nChannels;
    96 data=(uchar *)dst->imageData;//图像数据 char *imageData;
    97 // 反转图像
    98 for (int i=0;i<height;i++)
    99 {
    100 for (int j=0;j<width;j++)
    101 {
    102 for (int k=0;k<channels;k++)
    103 {
    104 data[i*step+j*channels+k]=255-data[i*step+j*channels+k];
    105 }
    106 }
    107 }
    108 // 显示
    109 cvShowImage("dst",dst);
    110 // 释放资源
    111 cvReleaseImage(&dst);
    112
    113 /*-------------------------------------------//
    114 //功能:图像背景估计
    115 //说明:
    116 //-------------------------------------------*/
    117 // 创建工作位图
    118 IplImage *tmp = 0; //定义临时图像指针
    119 IplImage *src_back = 0; //定义源图像背景指针
    120 tmp = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    121 src_back = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    122 // 创建结构元素
    123 IplConvKernel *element = 0; //定义形态学结构指针
    124 element = cvCreateStructuringElementEx( 4, 4, 1, 1, CV_SHAPE_ELLIPSE, 0);
    125 // 用该结构对源图象进行数学形态学的开操作后,估计背景亮度
    126 cvErode( src, tmp, element, 10);
    127 cvDilate( tmp, src_back, element, 10);
    128 cvNamedWindow( "src_back", CV_WINDOW_AUTOSIZE );
    129 cvShowImage( "src_back", src_back );
    130
    131 /*-------------------------------------------//
    132 //功能:从源图象中减去背景图像
    133 //说明:
    134 //-------------------------------------------*/
    135 IplImage *dst_gray = 0; //定义源文件去掉背景后的目标灰度图像指针
    136 dst_gray = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    137 cvSub( src, src_back, dst_gray, 0);
    138 cvNamedWindow( "dst_gray", CV_WINDOW_AUTOSIZE );
    139 cvShowImage( "dst_gray", dst_gray );
    140
    141 /*-------------------------------------------//
    142 //功能:使用阀值操作将图像转换为二值图像
    143 //说明:
    144 //-------------------------------------------*/
    145 IplImage *dst_bw = 0; //定义源文件去掉背景后的目标二值图像指针
    146 dst_bw = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    147 cvThreshold( dst_gray, dst_bw ,50, 255, CV_THRESH_BINARY ); //取阀值为50把图像转为二值图像
    148
    149 //cvAdaptiveThreshold( dst_gray, dst_bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5 );
    150
    151 cvNamedWindow( "dst_bw", CV_WINDOW_AUTOSIZE );
    152 cvShowImage( "dst_bw", dst_bw );
    153
    154 /*-------------------------------------------//
    155 //功能:检查图像中的目标对象数量
    156 //说明:
    157 //-------------------------------------------*/
    158 int Number_Object =0; //定义目标对象数量
    159 CvMemStorage *stor = 0;
    160 CvSeq * cont = 0;
    161 CvContourScanner contour_scanner;
    162 CvSeq * a_contour= 0;
    163 stor = cvCreateMemStorage(0);
    164 cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), stor);
    165 Number_Object = cvFindContours( dst_bw, stor, &cont, sizeof(CvContour), \
    166 CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) ); //找到所有轮廓
    167
    168 printf("Number_Object: %d\n", Number_Object);
    169
    170 /*-------------------------------------------//
    171 //功能:计算图像中对象的统计属性
    172 //说明:
    173 //-------------------------------------------*/
    174 IplImage *dst_contours = 0; //定义轮廓图像指针
    175 int contour_area_tmp = 0; //定义目标对象面积临时寄存器
    176 int contour_area_sum = 0; //定义目标所有对象面积的和
    177 int contour_area_ave = 0; //定义目标对象面积平均值
    178 int contour_area_max = 0; //定义目标对象面积最大值
    179 dst_contours = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    180 cvThreshold( dst_contours, dst_contours ,0, 255, CV_THRESH_BINARY_INV); //在画轮廓前先把图像变成白色
    181
    182 for(; cont; cont = cont->h_next)
    183 {
    184 cvDrawContours( dst_contours, cont, CV_RGB(255, 0, 0), CV_RGB(255, 0, 0), 0, 1, 8, cvPoint(0, 0) ); //绘制当前轮廓
    185
    186 contour_area_tmp = fabs(cvContourArea( cont, CV_WHOLE_SEQ )); //获取当前轮廓面积
    187
    188 if( contour_area_tmp > contour_area_max )
    189 {
    190 contour_area_max = contour_area_tmp; //找到面积最大的轮廓
    191
    192 }
    193 contour_area_sum += contour_area_tmp; //求所有轮廓的面积和
    194
    195 }
    196 contour_area_ave = contour_area_sum/ Number_Object; //求出所有轮廓的平均值
    197
    198 printf("contour_area_ave: %d\n", contour_area_ave );
    199 printf("contour_area_max: %d\n", contour_area_max );
    200 cvNamedWindow( "dst_contours", CV_WINDOW_AUTOSIZE );
    201 cvShowImage( "dst_contours", dst_contours );
    202
    203 /*-------------------------------------------//
    204 //功能:等待
    205 //原型:int cvWaitKey( int delay=0 );
    206 //参数:参数<=0表示不自动返回
    207 //注意:需要周期地被调用,除非HighGUI被用在某些能够处理事件的环境中。如在MFC环境下,这个函数不起作用
    208 //-------------------------------------------*/
    209 cvWaitKey(0);
    210
    211 /*-------------------------------------------//
    212 //功能:销毁窗口、释放资源
    213 //原型:void cvDestroyAllWindows(void);
    214 //-------------------------------------------*/
    215 cvDestroyAllWindows();
    216 cvReleaseImage(&src);
    217 cvReleaseImage(&tmp);
    218 cvReleaseImage(&src_back);
    219 cvReleaseImage(&dst_gray);
    220 cvReleaseImage(&dst_bw);
    221 cvReleaseImage(&dst_contours);
    222 cvReleaseMemStorage(&stor);
    223 cvDestroyWindow( "src" );
    224 cvDestroyWindow( "src_back" );
    225 cvDestroyWindow( "dst_gray" );
    226 cvDestroyWindow( "dst_bw" );
    227 cvDestroyWindow( "dst_contours" );
    228
    229 return 0;
    230
    231 }

    参考资料:

    http://www.opencv.org.cn/forum/download/file.php?id=761 【源码】

    Author:         SKySeraph

    Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

    From:         http://www.cnblogs.com/skyseraph/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的

  • 相关阅读:
    论文摘记 2017.4.6-4.9
    P4 PI库安装
    Markdown中的表格
    Easy install ryu
    《重构网络-SDN架构与实现》阅读随笔
    解决Github Desktop Repo publish 失败问题
    解决 "OperationalError: (sqlite3.OperationalError) no such table: ..."问题
    初始化 Flask 虚拟环境 命令
    Flask: socket.error: [Errno 48] Address already in use 问题
    【转】TCP端口号记录
  • 原文地址:https://www.cnblogs.com/skyseraph/p/1988685.html
Copyright © 2020-2023  润新知