问题
当我使用大于4000像素宽的OpenCV拍摄图像时,使用高质量的picam,图像数据出现损坏(偏移)。
更详细如前所述,当使用分辨率超过4000像素宽的OpenCV时,我无法获得良好的图像。我知道硬件不是问题所在,因为当我使用raspistill命令时,我可以得到一个干净的全分辨率(4056x3040)图像:
sudo raspistill -o testing.tiff -w 4056 -h 3040
下面是来自raspistill的干净输出:
4056x3040图像-由raspistill命令生成的干净图像
我能够在Python中使用OpenCV捕获图像:
import cv2 as cv
def main():
cap = cv.VideoCapture("/dev/video2", cv.CAP_V4L2)
cap.set(cv.CAP_PROP_FRAME_WIDTH, 4056)#works fine up to 4000
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 3040)
if not(cap.isOpened()):
print("could not open video device")
else:
print("cap opened")
ret, frame = cap.read()
if(ret):
cv.imwrite("./test_im.jpg", frame)
print("image saved")
else:
print("no capture data returned")
if __name__ == "__main__":
main()
或者我可以用c++在OpenCV中捕获:
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char *argv[]){
cv::Mat frame;
cv::VideoCapture cap("/dev/video2", cv::CAP_V4L2);
cap.set(cv::CAP_PROP_FRAME_WIDTH, 4056);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 3040);
if(cap.isOpened() == false){
std::cout << "cap not opened" << std::endl;
}
else{
std::cout << "cap opened" << std::endl;
}
cap >> frame;
if(frame.empty()){
std::cout << "empy frame";
}
else{
std::cout << "successfully captured image" << std::endl;
cv::imwrite("test.tiff", frame);
}
}
结果是一样的。
这是OpenCV的损坏输出:
4056x3040图像-损坏并被OpenCV捕获
对我来说,似乎是捕捉的时机出了问题。我保存它的格式也没有区别。我试过。png、。jpg和。tiff格式。结果总是一样的。重新启动后,结果保持不变。
如果我将所需的捕获分辨率降低到只有4000x3040,那么我就能够成功捕获。以下是结果:
4000x3040图像- OpenCV成功捕获
我不确定为什么会发生这种情况。并将非常感谢任何帮助!让我知道如果有任何其他信息可能是有用的!
<标题>系统- Raspberry Pi 4B with 4GB RAM.
- 优质Picam
- 运行Ubuntu 20.04
- OpenCV 4.5.5
我确定这个问题与树莓派和OpenCV所需的必要缓冲区有关。我相信这与这个关于堆栈溢出的答案有关。
因此,我能够通过降低分辨率来修复图像条纹,我要求在长度和宽度上都是32的倍数,例如4032x3040(而不是4056x3040)。这使我能够获得几乎全分辨率的图像,并且对于任务来说已经足够了。我无法弄清楚如何使用OpenCV和High Quality Raspicam获得全分辨率图像。