opencv中的绘图函数里面有画线画矩形画圆的函数,但是居然没有画点的函数。
在网上查了一下很多人都是用line或者circle来画点,但是实际上有更简单高效的方法——直接访问Mat类的像素点信息。
由于平常处理的都是二维图像,很少超过3维,所以cv::Mat中的at方法重载了有2个int参数的版本,用于访问某个像素点的RGB信息。
下面是一个举例:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
using namespace cv;
int main( void )
{
const int VERTEX_NUM = 1325;
/// Windows names
char freq_window[] = "freq";
/// Create black empty images
Mat freq_image = Mat::zeros( VERTEX_NUM, VERTEX_NUM, CV_8UC3 );
ifstream log( "swap[20131230Mon155037].log" );
vector< vector<int> > mat( VERTEX_NUM, vector<int>( VERTEX_NUM, 0 ) );
int oldc, newc;
char tmp;
while (!log.eof( )) {
log >> oldc >> tmp >> newc;
mat[oldc][newc]++;
freq_image.at<Vec3b>( oldc, newc ) = Vec3b( mat[oldc][newc], 255, 0 );
//(freq_image.at<Vec3b>( oldc, newc ))[0]++; // another way to operate
waitKey( 1 );
imshow( freq_window, freq_image );
}
imshow( freq_window, freq_image );
log.close( );
waitKey();
return 0;
}
参考文献:http://stackoverflow.com/questions/7899108/opencv-get-pixel-information-from-mat-image