快速像素访问 opencv
Fast Pixels Access opencv
我用这段代码将图像转换为矩阵,所以有人知道如何将这个矩阵转换为一维矩阵 -->vector 我想将图像数据作为一维数组,按行主要顺序排列,即第一行中的所有像素值都列在第一位,然后是第二行中的像素值,依此类推。
IplImage *img = cvLoadImage( "lena.jpg", CV_LOAD_IMAGE_COLOR);
CvMat *mat = cvCreateMat(img->height,img->width,CV_32FC3 );
cvConvert( img, mat );
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++){
CvScalar scal = cvGet2D( mat,j,i);
printf( "(%.f,%.f,%.f) ",scal.val[0], scal.val[1], scal.val[2] );}
printf("n");}
cvNamedWindow("une_window");
cvShowImage("une_window", img);
cvWaitKey();
cvDestroyWindow("une_window");
使用 C++ API:
cv::Mat img = cv::imread("a.jpg");
std::vector<uchar> pixels;
pixels.reserve(img.rows * img.cols * 3);
if(img.isContinuous()) {
pixels = std::vector<uchar>(img.ptr(0), img.ptr(0) + img.rows * img.cols * 3 );
}
else {
for(int i = 0; i != img.rows; ++i) {
uchar* p = img.ptr(i);
for(int j = 0; j != img.cols * 3; ++j) {
pixels.push_back(p[j]);
}
}
}
我相信
连续 Mats 的最快方法是使用 reshape 命令:
Mat colVec = img.reshape(1, img.rows*img.cols); // change to a Nx3 column vector
reshape 命令只是更改标头,因此它不需要像素访问,因此在 O(1) 时间内运行。
我认为您应该从视频解码器输出中观察以了解视频大小信息,从容器解析器中的元数据收集的其他信息可能不太准确。
在C++中,这实际上是一行:
cv::Mat_<float> img = cv::imread("a.jpg", 1);
std::vector<float> dest;
std::copy(img.begin(), img.end(), dest.begin());
相关文章:
- C++中的openCV Mat访问冲突
- OpenCV C++:当垫子类型未知时无法访问垫子元素?
- OpenCV C++ 3 维垫数据访问错误值
- OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 而失败,但在 X86_64 中工作
- OpenCV 像素访问点与 at() - 不同的值
- 访问和更改基于另一个图像的像素颜色-opencv c++
- OpenCV 访问像素的颜色值
- 在 OpenCV 中使用 hog.compute(..) 进行访问冲突
- 如何在OpenCV Cuda(GpuMat)中访问像素
- 在 OpenCV 中访问具有多个线程的 Mat 是否线程安全?
- 使用OpenCV访问摄像头(通过GSTREAMER)
- systemd无法通过opencv访问摄像头
- IP摄像头使用OpenCV访问
- OpenCV:访问 5D Matrix 的元素
- 来自 Mat 的 OpenCV 访问元素
- opencv访问CV_32FC3 BGR CV::Mat的颜色元素
- OpenCV访问MAT对象中的RGB值
- 我如何使用OpenCV访问外部网络摄像头?
- 使用Mat OpenCV访问像素
- 如何在visual C++2010或2008中使用OpenCV 2.1访问ip摄像头(compro IP50W)