今天在看Opencv的SIFT源码,至于有关于SIFT算法的博客还没有写完,等着我把源码看完再一起写完吧。
之前用Opencv编过不少的程序了,没想道OpenCV 2.0版本里最基础的Mat类用法还是有些不清楚,这里就总结一下
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("1.jpg");
resize(img, img, Size(375, 500));//resize为500*375的图像
cvtColor(img, img, CV_RGB2GRAY);//转为灰度图
imshow("gray_ori", img);
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
//at<类型>(i,j)进行操作,对于灰度图
img.at(i, j) = i+j;
}
}
imshow("gray_result", img);
waitKey(0);
return 0;
}
结果图如下:
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("1.jpg");
resize(img, img, Size(375, 500));//resize为500*375的图像
imshow("ori", img);
for (int i = 0; i < img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
//at<类型>(i,j)进行操作,对于灰度图
img.at(i, j)[0] = 255;//对于蓝色通道进行操作
//img.at(i, j)[1] = 255;//对于绿色通道进行操作
//img.at(i, j)[2] = 255;//对于红色通道进行操作
}
}
imshow("result", img);
waitKey(0);
return 0;
}
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("1.jpg");
int rows = img.rows;
int cols = img.cols * img.channels();
if(img.isContinuous())//判断是否在内存中连续
{
cols = cols * rows;
rows = 1;
}
imshow("ori",img);
for(int i = 0;i(i);
for(int j = 0;j
从上面个的代码中可以很明显的看出我们是如何操作图像的数据以及图像在Mat中的存放格式的,就是我们上面那个彩色图像的存放示意图中的格式,这里把彩色图像中的一个像素点分成三份,每一份都是uchar类型,因此我们这里不需要使用Vec3b数据类型。把彩色图像看成一个rows * (cols * channels)的二维数组进行操作,其中的每个元素的类型都是uchar类型。
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("1.jpg");
Mat img2;
img.copyTo(img2);
cout<<"图像的行数: "<(i);
for(int j = 0;j(i,j)进行操作,对于灰度图
img2.at(i, j)[0] = 255;//对于蓝色通道进行操作
//img.at(i, j)[1] = 255;//对于绿色通道进行操作
//img.at(i, j)[2] = 255;//对于红色通道进行操作
}
}
time2 = 1000 * ((double)getTickCount() - time2)/getTickFrequency();
cout<<"第二种方法用时: "<
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("1.jpg");
cout<<"img.rows: "<
看一下结果: