开发环境 vs2013+opencv2.4.9.
Mat的成员函数at()是一个模板函数。
代码1是at()函数在opencv里面的源代码
style="font-size:18px;">template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)//代码1
代码2是ptr()函数在opencv里面的源代码 style="font-size:18px;">inline uchar* Mat::ptr(int y)//代码2
测试代码:
#include
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
using namespace std;
//图像大小不变
cv::Mat imageTranslation1(cv::Mat &srcImage, int xoffset, int yoffset)
{
//获取图像行列数
int rows = srcImage.rows;
int cols = srcImage.cols;
cv::Mat resultImage(srcImage.size(), srcImage.type());
//图像的遍历
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
int x = j - xoffset;
int y = i - yoffset;
//判断边界大小
if (x >= 0 && y >= 0 && x < cols&&y < rows)
resultImage.at
(i, j) = srcImage.ptr
(y)[x];
}
}
//返回平移图像
return resultImage;
}
cv::Mat imageTranslation2(cv::Mat &srcImage, int xoffset, int yoffset)
{
int nrows = srcImage.rows + abs(yoffset);
int ncols = srcImage.cols + abs(xoffset);
cv::Mat resultImage(nrows, ncols, srcImage.type());
for (int i = 0; i
= 0 && y >= 0 && x < ncols&&y < nrows)
resultImage.at
(i, j) = srcImage.ptr
(y)[x]; } } return resultImage; } int main() { cv::Mat srcImage = imread("G:\\vc++图像处\\opencv\\28573_源码\\OpenCV图像处理编程实例_源码\\images\\flower4.jpg"); imshow("srcImage", srcImage); //图像左平移不改变图像大小 int xoffset = 50; int yoffset = 80; cv::Mat resultImage1 = imageTranslation1(srcImage, xoffset, yoffset); cv:imshow("resultImage1 ", resultImage1); //图像左平移改变大小 cv::Mat resultImage2 = imageTranslation2(srcImage, xoffset, yoffset); imshow("resultImage2 ", resultImage2); //图像右平移不改变大小 xoffset = -50; yoffset = -80; cv::Mat resultImage3 = imageTranslation1(srcImage, xoffset, yoffset); imshow("resultImage3 ", resultImage3); system("pause"); cv::waitKey(0); return 0; } /* This is a standalone program. Pass an image name as a first parameter of the program. Switch between standard and probabilistic Hough transform by changing "#if 1" to "#if 0" and back */ #include
#include
#include
int main(int argc, char** argv) { const char* filename = argc >= 2 ? argv[1] : "pic1.png"; IplImage* src = cvLoadImage( filename, 0 ); IplImage* dst; IplImage* color_dst; CvMemStorage* storage = cvCreateMemStorage(0); CvSeq* lines = 0; int i; if( !src ) return -1; dst = cvCreateImage( cvGetSize(src), 8, 1 ); color_dst = cvCreateImage( cvGetSize(src), 8, 3 ); cvCanny( src, dst, 50, 200, 3 ); cvCvtColor( dst, color_dst, CV_GRAY2BGR ); #if 0 lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 ); for( i = 0; i < MIN(lines->total,100); i++ ) { float* line = (float*)cvGetSeqElem(lines,i); float rho = line[0]; float theta = line[1]; CvPoint pt1, pt2; double a = cos(theta), b = sin(theta); double x0 = a*rho, y0 = b*rho; pt1.x = cvRound(x0 + 1000*(-b)); pt1.y = cvRound(y0 + 1000*(a)); pt2.x = cvRound(x0 - 1000*(-b)); pt2.y = cvRound(y0 - 1000*(a)); cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 ); } #else lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 ); for( i = 0; i < lines->total; i++ ) { CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 ); } #endif cvNamedWindow( "Source", 1 ); cvShowImage( "Source", src ); cvNamedWindow( "Hough", 1 ); cvShowImage( "Hough", color_dst ); cvWaitKey(0); return 0; }