OpenCV meanshift 图像分割代码

 

 

参考:这个帖子的主要代码有错误,根据回帖改了一些

http://www.cnblogs.com/tornadomeet/archive/2012/06/06/2538695.html

 

// meanshift.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
// meanshift_segmentation.cpp : 定义控制台应用程序的入口点。
//

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

#pragma comment(lib,"opencv_highgui2410d.lib")
#pragma comment(lib,"opencv_core2410d.lib")
#pragma comment(lib,"opencv_imgproc2410d.lib")

using namespace cv;
using namespace std;

Mat src,dst;

int spatialRad=10,colorRad=10,maxPryLevel=1;

//const Scalar& colorDiff=Scalar::all(1);

void meanshift_seg()

{

    ////调用meanshift图像金字塔进行分割

    pyrMeanShiftFiltering(src,dst,spatialRad,colorRad,maxPryLevel);

    RNG rng=theRNG();

    Mat mask(dst.rows+2,dst.cols+2,CV_8UC1,Scalar::all(0));

    for(int i=0;i<dst.rows;i++)    //opencv图像等矩阵也是基于0索引

        for(int j=0;j<dst.cols;j++)

            if(mask.at<uchar>(i+1,j+1)==0)

            {

                Scalar newcolor(rng(256),rng(256),rng(256));

                floodFill(dst,mask,Point(j,i),newcolor,0,Scalar::all(1),Scalar::all(1));

            }

    imshow("dst",dst);

}

void meanshift_seg_s(int i,void *)

{

    spatialRad = i;

    meanshift_seg();

}

void meanshift_seg_c(int i,void *)

{

    colorRad = i;

    meanshift_seg();

}

void meanshift_seg_m(int i,void *)

{

    maxPryLevel = i;

    meanshift_seg();

}

int main(int argc, uchar* argv[])

{

    namedWindow("src",WINDOW_AUTOSIZE);

    namedWindow("dst",WINDOW_AUTOSIZE);

    src=imread("swan.jpg");

    CV_Assert(!src.empty());

    spatialRad=10;

    colorRad=10;

    maxPryLevel=1;

    //虽然createTrackbar函数的参数onChange函数要求其2个参数形式为onChange(int,void*)

    //但是这里是系统响应函数,在使用createTrackbar函数时,其调用的函数可以不用写参数,甚至

    //括号都不用写,但是其调用函数的实现过程中还是需要满足(int,void*)2个参数类型

    createTrackbar("spatialRad","dst",&spatialRad,80,meanshift_seg_s);

    createTrackbar("colorRad","dst",&colorRad,60,meanshift_seg_c);

    createTrackbar("maxPryLevel","dst",&maxPryLevel,5,meanshift_seg_m);

//    meanshift_seg(0,0);

    imshow("src",src);

    /*char c=(char)waitKey();

    if(27==c)

        return 0;*/

    imshow("dst",src);

    imshow("flood",src);

    waitKey();//无限等待用户交互响应

//    while(1);//这里不能用while(1)的原因是需要等待用户的交互,而while(1)没有该功能。虽然2者都有无限等待的作用。

    return 0;

}

 

实现效果:

 

时间: 2024-09-27 16:52:03

OpenCV meanshift 图像分割代码的相关文章

opencv 一段代码出错了

问题描述 opencv 一段代码出错了 显示.exe停止工作,但是去掉那个for循环就可以运行,是ptr<>的使用不当吗#include#include#include #include using namespace std;using namespace cv; int main(){ // 读入一张图片 Mat img = imread(""F:/vsprogram/projecttest/01.jpg""); // 创建一个名为 "&q

opencv捕捉视频代码哪儿错了(在书上复制的代码 但报错了)

问题描述 opencv捕捉视频代码哪儿错了(在书上复制的代码 但报错了) -*- coding: utf-8 -*- """ Created on Fri Jan 3 21:06:22 2014 @author: duan """ import numpy as np import cv2 cap = cv2.VideoCapture(0) while(True): ret, frame = cap.read() gray = cv2.cvtCo

opencv下surf代码出错显示未经处理的异常: 0xC0000005

问题描述 opencv下surf代码出错显示未经处理的异常: 0xC0000005 #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/nonfree.hpp" #include using na

houghpeaks函数在opencv下的代码实现

问题描述 houghpeaks函数在opencv下的代码实现 matlab中的houghpeaks函数,在opencv下的具体代码实现

OpenCV 1 图像分割--分水岭算法代码

// watershed_test20140801.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" // // ch9_watershed image // This is an exact copy of the watershed.cpp demo in the OpenCV ../samples/c directory // // Think about using a morphologically eroded forground an

OpenCV stereo matching 代码 matlab实现视差显示

转载请注明出处:http://blog.csdn.net/wangyaninglm/article/details/44151213, 来自:shiter编写程序的艺术 基础知识 计算机视觉是一门研究使用计算机来模拟人的视觉系统的学科."一图胜千言",人类对于图像中的信息感知效率远超文字等其他媒介,人类获取的信息总量中更是有高达80%依靠视觉系统[1].相对于人类高效的图像信息提取能力,计算机在图像信息的理解上仍然效率低下. 计算机视觉作为一门交叉学科,综合了生物学,心理学,数学,计算

利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

原文:利用OpenCV检测图像中的长方形画布或纸张并提取图像内容 基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了.不妨把应用的场景分为以下: 纸张四角的坐标(图中红点)已知的情况 也就是上面的左图中4个红点是可以准确获取,比如手动标注

OpenCV 图像力矩

OpenCV 图像力矩 目的 本文将带你学习: 使用 OpenCV 函数 moments 使用 OpenCV 函数 contourArea 使用 OpenCV 函数 arcLength 代码 #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include &

用鼠标在视频中方画出标示框c#调用opencv

问题描述 用鼠标在视频中方画出标示框c#调用opencv 如果有代码最好了.大神们好,我想请教一个问题,求赐教!!像MouseUp.MouseDown.MouseMove.Paint 以这种方式出现-- private void Form1_MouseDown(object sender, MouseEventArgs e)--是用什么什么插件(我也不知道叫什么就是.dll的文件) 解决方案 雇佣一个程序员帮你吧,你什么都不知道. 解决方案二: 没看懂你说的是什么呢... 这个不是控件事件吗?