小程式,隨便記錄下下~~
遍曆一幅映像,返回 像素值 為 0 的 點的座標:
#include "stdafx.h"#include <stdio.h>#include <cv.h>#include <highgui.h>#include "cvaux.h" //必須引此標頭檔using namespace std;vector<CvPoint> cal_dark(IplImage *img );int main( int argc, char** argv ){ IplImage *img = cvLoadImage("rice.png",0);if(img == NULL){printf("img load failed!\n");return 0;}cvThreshold(img, img, 128, 255, CV_THRESH_BINARY);vector<CvPoint> myVector = cal_dark(img);int size = myVector.size();int i;for(i = 0; i < size; i++){//printf("[%d, %d]", myVector[i].x, myVector[i].y);if( i == 10)printf("\n");}///////////////////////////test////////////////////////IplImage *test = cvCreateImage(cvGetSize(img), 8, 1);memset(test->imageData, 255, test->widthStep * test->height);for(i = 0; i < size; i++){CvScalar s;s.val[0] = 0.0;cvSet2D(test, myVector[i].x, myVector[i].y, s);}cvNamedWindow("img"); //原圖二值化後cvNamedWindow("test"); //根據得到的座標產生的映像cvShowImage("img",img);cvShowImage("test",test);cvWaitKey(-1);cvReleaseImage(&img);cvReleaseImage(&test);cvDestroyAllWindows();getchar();return 0;}vector<CvPoint> cal_dark(IplImage *img ){int w = img->width;int h = img->height;//CvPoint *pos_dark = (CvPoint *)malloc(w * h *sizeof(CvPoint));vector<CvPoint> PointVector;int i, j;for(i = 0; i < h; i++){for(j = 0; j < w; j++){CvScalar s = cvGet2D(img, i, j);if(s.val[0] == 0.0){CvPoint point=cvPoint(i, j);PointVector.push_back(point);}}}return PointVector;}
結果:
===================================================================================
PS:
建立一幅映像,用memset置為 255 時:
IplImage *test = cvCreateImage(cvGetSize(img), 8, 1);
memset(test->imageData, 255, test->widthStep * test->height);
注意, 是把 IplImage 映像的 資料 部分 置為 255 ,資料起始地址是
test->imageData
話說, IplImage 的頭 長度 怎麼計算來著?