影象畫素點讀取和賦值
//取IplImage影象畫素值
int main()
{
IplImage* src = cvLoad("filename",0); //-1預設讀取原通道,0 灰度圖,1彩色圖
if(src!=0)
{
for(int i=0;i<src->height;i++)
{
uchar* pixel = (uchar*)src->imageData+i*src->widthStep;
for(int j=0;j<src->width;j++)
{
pixel[3*j] = 0;
pixel[3*j+1] = 0;
pixel[3*j+2] = 0;
//另外一種效率不好的演算法
CvScalar s;
s = cvGet2D(src,i,j); // get the(i,j)pixel value;
s.val[0] = 0;
s.val[1] = 0;
s.val[2] = 0;
cvSet2D(src,i,j,s);
//另外一種演算法
int b = CV_IMAGE_ELEM(img, uchar, y1, x1 * 3);
// image複製到mat
CV_IMAGE_ELEM(pImage, uchar, i, j) = CV_MAT_ELEM(*mat, uchar, i, j);
}
}
}
}
//取Mat影象畫素值
int main()
{
Mat img = imread("filename");.
for(int i=0;i<img.rows;i++)
for(int j=0;j<img.cols;j++)
{
if(img.at<Vec3b>(i,j)>128)
img.at<Vec3b>(i,j) = Vec3b(255,255,255);
// 若影象為三通道,則取影象畫素點和對影象畫素點賦值程式碼
int Bpix = img.at<Vec3b>(i,j)[0];
int Gpix = img.at<Vec3b>(i,j)[1];
int Rpix = img.at<Vec3b>(i,j)[2]; //取畫素值
img.at<Vec3b>(i,j)[0] = 0; //畫素賦值
//單通道讀取畫素值
int Bpix= img.at<uchar>(i,j);
//另一種Mat影象畫素讀取和賦值程式碼
int pix = int(*(img.data+img.step[0]*row + img.step[1]*col));
*(img.data+img.step[0]*row + img.step[1]*col) = 255;
//另外一種Mat_過載演算法
Mat_ tempSrc = src;
tempSrc(col,row) = Vec3b(0,0,255);
//另外一種Mat::ptr模板
uchar* data = img.ptr(row); // row為行迴圈
for(int col=0;col<img.cols;col++)
{
data[col*3] = 0;
data[col*3+1] = 0;
data[col*3+2] = 0;
}
}
}
//取CvMat 影象畫素值
float vals[] = {0.866025,-0.500000,0.500000,0.866025};
CvMat rotmat;
cvInitMatHeader(&rotmat, 2, 2, CV_32FC1,vals);
//rotmat.step 行資料長度,單位位元組數
int pix = *(rotmat.data.fl + i*rotmat.rows + j);
int pix = *((float *)(rotmat.data.ptr + i * rotmat.step) + j); // 對uchar強制轉換
//三種CvMat初始化方式
//僅初始化矩陣頭,不為資料分配記憶體空間
CvMat* cvCreateMatHeader(int rows, int cols, int type);
//僅為資料體分配記憶體空間
void cvCreateData(CvArr* arr);
//既建立cvMat結構又為資料分配記憶體(最常用)
CvMat* cvCreateMat(int rows, int cols, int type);
//根據矩陣mat克隆一個一模一樣的矩陣,不僅矩陣頭一樣,資料也完全複製過去
CvMat* cvCloneMat(const cvMat* mat);
//如果不想複製資料,可以根據矩陣mat克隆一個一模一樣的矩陣頭
CvMat* cvInitMatHeader(CvMat* mat, int rows, int cols, int type, void* data=NULL, int step=CV_AUTOSTEP);
//返回資料的值
ElemType data = CV_MAT_ELEM(*mat, ElemType, row, col);
//返回資料的指標,適用於同時讀取和設定,但注意型別轉化
ElemType* ptr = (ElemType*)CV_MAT_ELEM_PTR(*mat, row, col);//讀
*((ElemType*)CV_MAT_ELEM_PTR(*mat, row, col)) = data;//寫
//返回資料的值,可以返回double和CvScalar兩種型別
double cvGetReal1D(const CvArr* arr, int idx0);
double cvGetReal2D(const CvArr* arr, int idx0, int idx1);
double cvGetReal3D(const CvArr* arr, int idx0, int idx1, int idx2);
double cvGetRealND(const CvArr* arr, int* idx);
CvScalar cvGet1D(const CvArr* arr, int idx0);
CvScalar cvGet2D(const CvArr* arr, int idx0, int idx1);
CvScalar cvGet3D(const CvArr* arr, int idx0, int idx1, int idx2);
CvScalar cvGetND(const CvArr* arr, int* idx);
//返回資料的指標
uchar* CvPtr1D(const CvArr* arr, int idx0, int* type=NULL);
uchar* CvPtr2D(const CvArr* arr, int idx0, int idx1, int* type=NULL);
uchar* CvPtr1D(const CvArr* arr, int idx0, int idx1, int idx2, int* type=NULL);
uchar* CvPtr1D(const CvArr* arr, int* idx, int* type=NULL, int create_node=1, unsigned * precalc_hashval=NULL);
//此外對於<浮點型單通道矩陣>有兩個簡便的函式
double cvmGet(const CvMat* mat, int row, int col);
void cvmSet(CvMat* mat, int row, int col, double value);