opencv获取图像像素值的坑
生活随笔
收集整理的這篇文章主要介紹了
opencv获取图像像素值的坑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我最開始學習OpenCV的時候,網上搜索,獲取某個像素點的值,大概是這樣的,
srcImg.at<uchar>(i, j)
當然這樣可以獲取,但是效率很低,也就是速度很慢,然后網上搜索了第二個方法,大概是這樣的
int MainWindow::brightTest(Mat &grayImage){int height = grayImage.rows;int width = grayImage.cols;unsigned int sumBright = 0;int totalCount = height * width;if(totalCount == 0){return -1;}for(int i = 0; i < height; i++){for(int j = 0; j < width; j++){sumBright += grayImage.data[i * width + j];}}return sumBright / totalCount;
}
直觀上看,也沒啥問題,因為data指的就是Mat的數據區,然后根據坐標來算出具體的位置偏移,再獲取像素值,但這里實際上是有一個坑,就是說Mat的數據可能是不連續的,也就是如果用isContinuous函數來判斷的話,可能數據不是連續存儲的,可以參考
OpenCV isContinuous()連續存儲的問題_pan_jinquan的博客-CSDN博客
cv::Rect rect(1, 1, 100, 100);cv::Mat crop_img = src(rect);//裁剪后的圖像是不連續的
而我傳入的參數,經常是傳入ROI區域,在按照上述方法調用時,經常獲取不到預期結果,
之前想的辦法是,如果傳入一個grayImage,那我就先clone一下,clone之后的圖像就可以獲取到正確的結果,
crop_img2 = crop_img.clone();//重新clone()后的圖像是連續的
這是以前我經常干的事兒,當然實際也有另一個方案,對于不連續存儲的數據,也能獲取到正確的結果,參考代碼如下:
int MainWindow::brightTest(Mat &grayImage){int height = grayImage.rows;int width = grayImage.cols;unsigned int sumBright = 0;int totalCount = height * width;if(totalCount == 0){return -1;}for(int i = 0; i < height; i++){for(int j = 0; j < width; j++){sumBright += grayImage.ptr<uchar>(i)[j];}}return sumBright / totalCount;
}
也就是用ptr的方法來獲取像素點的亮度值
備份CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(CameraShow)if(MSVC)option(OpenCV_STATIC "Use static OpenCV libraries" OFF)
endif()find_package(OpenCV REQUIRED)include_directories(. ${OpenCV_INCLUDE_DIRS})add_executable(CameraShowmain.cpp)
target_link_libraries(CameraShow ${OpenCV_LIBS})
總結
以上是生活随笔為你收集整理的opencv获取图像像素值的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tf2运行YOLOv4(tflite)
- 下一篇: 基于onnx的人脸识别