问题
当我使用OpenCV拍摄宽度大于4000像素的图像时,使用高质量的picam,图像数据似乎已损坏(偏移)。
更多详细信息
如前所述,当我使用OpenCV在超过4000像素宽的分辨率时,我不能得到一个好的图像。我知道硬件不是问题,因为当我使用raspistill命令时,我可以得到一个干净的全分辨率(4056 x3040)图像:sudo raspistill -o testing.tiff -w 4056 -h 3040
下面是raspistill的清晰输出:
4056x3040 image - Clean Image produced by raspistill command
我可以在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 image - Corrupted and captured by OpenCV
在我看来,好像是捕获的时间出了问题。我保存它的格式也没有什么不同。我试过.png、.jpg和. tiff。结果总是一样。重新启动后,结果仍然一样。
如果我将所需的捕获分辨率降低到4000 x3040,那么我就可以成功地进行捕获。以下是结果:
4000x3040 image - successfully captured by OpenCV
我不知道为什么会发生这种情况。真的很感激任何帮助!让我知道如果有任何其他信息可能是有用的!
系统
- 树莓派4 B与4GB内存.
- 高品质Picam
- 运行Ubuntu 20.04
- OpenCV 4.5.5版本
1条答案
按热度按时间8cdiaqws1#
我确定这个问题与Raspberry Pi和OpenCV所需的必要缓冲区有关。我相信它与堆栈溢出的this答案有关。
因此,我能够通过降低分辨率来修复图像拖尾,我要求在长度和宽度上都是32的倍数,例如4032x3040(而不是4056X3040)。这让我得到了几乎全分辨率的图像,而且已经足够完成这项任务了。我不知道如何使用OpenCV和高质量的Raspicam获得全分辨率图像。