vc 下 用 opencv 实现的--- 遍历图像,返回值为 a 的 像素点 的坐标

来源:互联网 发布:se源码 编辑:程序博客网 时间:2024/05/18 01:50


小程序,随便记录下下~~


遍历一幅图像,返回 像素值 为 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 的头 长度 怎么计算来着?生气