c++ opencv 分裂合并-求大神帮忙把代码改成调用opencv库的,谢谢。

问题描述

求大神帮忙把代码改成调用opencv库的,谢谢。

include

using namespace std;
#include //需要使用堆栈,对堆栈进行操作
#include "conio.h"

include "viLib.h" // 包含头文件

pragma comment( lib, "viLib.lib" ) // 包含viLib.lib库

include "viImage.h" // 包含头文件

pragma comment( lib, "viImage.lib" )

struct SplitArea
{
unsigned int w; // 分裂块图像的宽度
unsigned int h; // 分裂块图像的高度
unsigned int left; //相对源图像数据的偏移宽度
unsigned int top; // 相对源图像数据的偏移高度
};
void areaSplitCombine(unsigned char *srcImage, // 源图像数据
unsigned int Width, // 源图像的宽度
unsigned int Heigh) // 相对源图像数据的偏移高度
{
//初始区域压栈即整幅图片压栈
stack MyStack;
SplitArea splitarea;
splitarea.w = Width;
splitarea.h = Heigh;
splitarea.left = 0;
splitarea.top = 0;
MyStack.push(splitarea); //原始图像的区域信息栈
while(!MyStack.empty())
{
//区域出栈
splitarea = MyStack.top();
MyStack.pop();
int childWidthTemp[3], childHeightTemp[3];//用于存放图像分裂后的四块子图像的宽度和高度
int n, m, l;
n = (splitarea.top * Width + splitarea.left); // 该块图像的左上角像素值在数组中的下标
// 把图像分成4块,采用数组分别存储3个宽度值和3个高度值,该段程序可以处理该块图像的宽度或高度值为奇数的情况
childWidthTemp[0] = 0;
childWidthTemp[2] = (splitarea.w + 1) / 2;
childWidthTemp[1] = splitarea.w - childWidthTemp[2];//图像宽度为偶数的情况下, childWidthTemp[1]和childWidthTemp[2]无差别,
//奇数情况下childWidthTemp[2]-childWidthTemp[1]=1
childHeightTemp[0] = 0;
childHeightTemp[2] = (splitarea.h + 1) / 2;
childHeightTemp[1] = splitarea.h - childHeightTemp[2];//图像宽度为偶数的情况下, childHidthTemp[1]和childHidthTemp[2]无差别,
//奇数情况下childHidthTemp[2]-childHidthTemp[1]=1
// 计算每一块图像的属性值(均方差)
int Value;
int ValueTemp;
int i, j;//对分成的四块图像进行操作的循环
for(i = 1; i < 3; i++)
{
for(j = 1; j < 3; j++)
{
Value = 0;
m = (n + Width * childHeightTemp[i - 1] + childWidthTemp[j - 1]);
int x, y;
for(x = 0; x < childHeightTemp[i]; x++)
{
for(y = 0; y < childWidthTemp[j];y++)
{
l = (m + Width * x + y) ;//每块图像中各个像素点在存储数组中的位置下标
ValueTemp = srcImage[l];
Value = Value+ValueTemp;
}
}// 灰度值之和
if(childHeightTemp[i] * childWidthTemp[j] == 0)//分裂至最终结束时分裂块的宽度和高度其中有一个位0,那么分裂结束
{
continue;
}
if(childHeightTemp[i] * childWidthTemp[j] == 1)//分裂至单个像素时,将单个像素进行二值化
{
l = m;
if(srcImage[l] < 125)
{
srcImage[l]= 0;

                   }
                   else
                   {
                       srcImage[l] =  255;

                   }
                   continue;
               }
               // 各块图像的灰度平均值
               int ValueS[2][2];     // 用于存储块图像的灰度值
               ValueS[i - 1][j - 1] = Value / (childHeightTemp[i] * childWidthTemp[j]);
               int Value1=0,ValueTemp1;
                for(x = 0;x < childHeightTemp[i]; x++)
               {
                   for(y = 0; y< childWidthTemp[j]; y++)
                   {
                        l = (m + Width * x + y) ;
                        ValueTemp1 = srcImage[l];
                        Value1 = Value1+(ValueTemp1- ValueS[i - 1][j - 1])*(ValueTemp1- ValueS[i - 1][j - 1]);
                   }
               }
                // 各块图像的均方差
                int ValueS1[2][2]; // 用于存储块图像的均方差
                 ValueS1[i - 1][j - 1]= Value1 / (childHeightTemp[i] * childWidthTemp[j]);

               //  对每一块进行判断是否需要分裂
               // 分裂原则: 图像的均方差超过某个阈值是需要分裂
               if(ValueS1[i - 1][j - 1]  > 100) // 均方差大于某个阈值时需要分裂
               {   SplitArea childarea;
                   childarea.w  = childWidthTemp[j];
                   childarea.h  = childHeightTemp[i];
                   childarea.left  = splitarea.left + childWidthTemp[j - 1];
                   childarea.top   = splitarea.top + childHeightTemp[i - 1];
                   MyStack.push(childarea);
               }
               else    // 如果不需要分裂, 则进行合并(直接填充该块图像为灰度值的平均值)
               {
                   for(x = 0; x < childHeightTemp[i]; x++)
                   {
                        for(y = 0; y < childWidthTemp[j]; y++)
                        {
                             l = (m + Width * x + y) ;
                            srcImage[l] =ValueS[i - 1][j - 1];

                        }
                   }
               }

          }
     }

 }
 return;

}

int main (int argc, char * const argv[])
{
int rv;
int PixelFormat = 24, Width, Height;
unsigned char * pImg;
unsigned char * pBin;

if ( argc < 2 )
{
    fprintf( stderr, "Usage: GetContour.exe imagen" ) ;
    return 0 ;
}

rv = viGetImageWH( argv[1], Width, Height ) ;
if ( rv == 0 )
{
    printf( "Could not get image. Program exits!n" );
    exit( 0 );
}
pImg = new unsigned char [ Width*Height*PixelFormat/8 ];
viReadImageFile( argv[1], pImg, Width, Height, PixelFormat );
pBin = new unsigned char [Width*Height];
viColor24toGray8(pImg, Width, Height,1,pBin);
areaSplitCombine( pBin, Width, Height);
viNamedWindow( "Image", GUI_WINDOW_AUTOSIZE );
viShowImage( "Image",pBin, Width, Height, 8, 0 );
viWaitKey( 0 );
delete [] pImg;
delete [] pBin;
viDestroyAllWindows();
return 0;

}

时间: 2024-11-03 21:05:30

c++ opencv 分裂合并-求大神帮忙把代码改成调用opencv库的,谢谢。的相关文章

android java 回调-关于android中的回调机制 求大神帮忙看看代码

问题描述 关于android中的回调机制 求大神帮忙看看代码 boss 叫我写一个sdk 然后里面得实现回调 还给了我个demo 说回调机制和这个demo 一样 大概就是从A客户端发出一个数据 然后我这边接受 接受和执行一个事件 然后再回调给C public class DemoActivity extends Activity { private InputInterceptor input; @Override protected void onCreate(Bundle savedInst

app- 想要实现多点触控和凸包Melkman的结合,然而APP一跑就跳出,求大神帮忙看看代码!

问题描述 想要实现多点触控和凸包Melkman的结合,然而APP一跑就跳出,求大神帮忙看看代码! Multitouch部分单独跑没问题,Melkman我是参考了http://xiaoming2xiaohong.iteye.com/blog/1297456 解决方案 需要给出Log日志,然后进行判断,不然不好分析啊

c++-C++代码问题,求大神帮忙看看代码有什么问题?

问题描述 C++代码问题,求大神帮忙看看代码有什么问题? #include "stdafx.h" #include #include #include #define M_PI 3.14159265358979323846 int main(int argc, char* argv[]) { int tableSize=512; double sinTable[]={0}; for(int n = 0; n < (tableSize + 1); n++) { sinTable[n

命令行-求大神帮忙实现windows C/C++调用系统命令,实在是无法实现啊

问题描述 求大神帮忙实现windows C/C++调用系统命令,实在是无法实现啊 两个系统命令如下: 如果在cmd下: netsh trace start capture=yes tracefile=C:Temp.etl 就开始执行,收集数据,停止收集数据时,使用 netsh trace stop 则等待他将数据成功写入指定文件即可 解决方案 system("pause")类似这中吧,你那个字符串放进了就行 或者打开cmd,完后输入流重定向进去啊 解决方案二: 很简单,可以使用匿名管道

Android http client response500错误,求大神帮忙看看代码!

问题描述 Android http client response500错误,求大神帮忙看看代码! http://121.42.195.113/usay/register.jsp服务器这里没错啊....但不知道为什么放到安卓上就不行 package com.example.demo_jsom1; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http

求大神帮忙看看代码。。。错在哪里了……跪谢

问题描述 HTTPStatus500-javax/servlet/ServletRequesttypeExceptionreportmessagejavax/servlet/ServletRequestdescriptionTheserverencounteredaninternalerrorthatpreventeditfromfulfillingthisrequest.exceptionjava.lang.NoClassDefFoundError:javax/servlet/ServletR

opencv 霍夫变换 求大神帮忙看看哪里错了

问题描述 opencv 霍夫变换 求大神帮忙看看哪里错了 #include<opencv2/opencv.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std; int main() { Mat src = imread("D:\杂项\图片素材\2.jpg"); Mat dst, edge; Canny(src, edge,50,200,3); cvt

online adaboost tracking 程序调试出错 ,求大神帮忙

问题描述 online adaboost tracking 程序调试出错 ,求大神帮忙 大家好,我使用opencv +C++调的online adaboost tracking 程序.怎么编译可以成功,到了调试,就出现下面这种错误呢? 解决方案 已经解决问题.原来是config.txt 文件没有配置正确

c#-关于C#更新mysql数据库结果异常问题,求大神帮忙

问题描述 关于C#更新mysql数据库结果异常问题,求大神帮忙 本人代码如下 CommonFormService.updateScore(transaction, userid, kindid, score, righttime, maxConright, maxConWrong, successRate, equispaced, nowConrightWrong, qishu, sellid); 在整个方法中多次调用此段代码,只是其中参数不同.updateScore方法代码如下 public