资源简介
SeamCarving的C++实现代码,使用opencv库。包含完整项目工程及测试图像,可直接使用

代码片段和文件信息
#include
#include
#include
#define NUM 220
void calculateEnergy(cv::Mat& srcMatcv::Mat& dstMatcv::Mat& traceMat)
{
srcMat.copyTo(dstMat); //不用“=”,防止两个矩阵指向的都是同一个矩阵,现在只需要传里面的数值
for (int i = 1;i < srcMat.rows;i++) //从第2行开始计算
{
//第一列
if (dstMat.at(i-10) <= dstMat.at(i-11))
{
dstMat.at(i0) = srcMat.at(i0) + dstMat.at(i-10);
traceMat.at(i0) = 1; //traceMat记录当前位置的上一行应取那个位置,上左为0,上中1,上右为2
}
else
{
dstMat.at(i0) = srcMat.at(i0) + dstMat.at(i-11);
traceMat.at(i0) = 2;
}
//中间列
for (int j = 1;j < srcMat.cols-1;j++)
{
float k[3];
k[0] = dstMat.at(i-1j-1);
k[1] = dstMat.at(i-1j);
k[2] = dstMat.at(i-1j+1);
int index = 0;
if (k[1] < k[0])
index = 1;
if (k[2] < k[index])
index = 2;
dstMat.at(ij) = srcMat.at(ij) + dstMat.at(i-1j-1+index);
traceMat.at(ij) = index;
}
//最后一列
if (dstMat.at(i-1srcMat.cols-1) <= dstMat.at(i-1srcMat.cols-2))
{
dstMat.at(isrcMat.cols-1) = srcMat.at(isrcMat.cols-1) + dstMat.at(i-1srcMat.cols-1);
traceMat.at(isrcMat.cols-1) = 1;
}
else
{
dstMat.at(isrcMat.cols-1) = srcMat.at(isrcMat.cols-1) + dstMat.at(i-1srcMat.cols-2);
traceMat.at(isrcMat.cols-1) = 0;
}
}
}
// 找出最小能量线
void getMinEnergyTrace(const cv::Mat& energyMatconst cv::Mat& traceMatcv::Mat& minTrace)
{
int row = energyMat.rows - 1;// 取的是energyMat最后一行的数据,所以行标是rows-1
int index = 0; // 保存的是最小那条轨迹的最下面点在图像中的列标
// 获得index,即最后那行最小值的位置
for (int i = 1;i < energyMat.cols;i++)
{
if (energyMat.at(rowi) < energyMat.at(rowindex))
{
index = i;
} // end if
} // end for i = ...
// 以下根据traceMat,得到minTrace,minTrace是多行一列矩阵
{
minTrace.at(row0) = index;
int tmpIndex = index;
for (int i = row;i > 0;i--)
{
int temp = traceMat.at(itmpIndex);// 当前位置traceMat所存的值
if (temp == 0) // 往左走
{
tmpIndex = tmpIndex - 1;
}
else if (temp == 2) // 往右走
{
tmpIndex = tmpIndex + 1;
} // 如果temp = 1,则往正上走,tmpIndex不需要做修改
minTrace.at(i-10) = tmpIndex;
}
}
}
// 删掉一列
void delOneCol(cv::Mat& srcMatcv::Mat& dstMatcv::Mat& minTracecv::Mat& beDeletedLine)
{
for (int i = 0;i < dstMat.rows;i++)
{
int k = minTrace.at(i0);
for (int j = 0;j < k;j++)
{
dstMat.at(ij)[0] = srcMat.at(ij)[0];
dstMat.at(ij)[1] = srcMat.at(ij)[1];
dstMat.at(ij)[2] = srcMat.at(ij)[2];
}
for (int j = k;j < dstMat.cols-1;j++)
{
if (j == dstMat.cols-1)
{
int a = 1;
}
dstMat.at(ij)[0] = srcMat.at(ij+1)[0];
dstMat.at(ij)[1] = srcMa
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 157565 2011-12-11 18:55 代码\SeamCarving\1.jpg
文件 8410 2011-12-12 13:18 代码\SeamCarving\Debug\BuildLog.htm
文件 198279 2011-12-12 13:18 代码\SeamCarving\Debug\main.obj
文件 65 2011-12-12 13:13 代码\SeamCarving\Debug\mt.dep
文件 621 2011-12-12 13:13 代码\SeamCarving\Debug\SeamCarving.exe.intermediate.manifest
文件 814080 2011-12-12 13:18 代码\SeamCarving\Debug\vc90.idb
文件 921600 2011-12-12 13:18 代码\SeamCarving\Debug\vc90.pdb
文件 7911 2011-12-29 13:02 代码\SeamCarving\main.cpp
文件 8854 2011-12-29 13:02 代码\SeamCarving\Release\BuildLog.htm
文件 2202240 2011-12-29 13:02 代码\SeamCarving\Release\main.obj
文件 65 2011-12-29 13:02 代码\SeamCarving\Release\mt.dep
文件 616 2011-12-29 13:02 代码\SeamCarving\Release\SeamCarving.exe.intermediate.manifest
文件 527360 2011-12-29 13:02 代码\SeamCarving\Release\vc90.idb
文件 749568 2011-12-29 13:02 代码\SeamCarving\Release\vc90.pdb
文件 3866 2011-12-10 17:03 代码\SeamCarving\SeamCarving.vcproj
文件 1409 2012-01-06 12:21 代码\SeamCarving\SeamCarving.vcproj.lcy-PC.lcy.user
文件 131068 2011-12-11 19:04 代码\SeamCarving\原图.jpg
文件 108472 2011-12-11 18:59 代码\SeamCarving\缩小.jpg
文件 899 2011-12-29 13:02 代码\SeamCarving.sln
..A..H. 30208 2012-01-06 12:21 代码\SeamCarving.suo
目录 0 2012-01-05 21:33 代码\SeamCarving\Debug
目录 0 2012-01-05 21:33 代码\SeamCarving\Release
目录 0 2012-01-05 21:36 代码\SeamCarving
目录 0 2012-04-23 21:21 代码
----------- --------- ---------- ----- ----
5873156 24
相关资源
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
评论
共有 条评论